楼主: NinGoo

[Tips] 关于虚拟索引(Virtual Index)

[复制链接]
论坛徽章:
2
授权会员
日期:2007-06-22 17:45:30会员2007贡献徽章
日期:2007-09-26 18:42:10
11#
发表于 2007-5-16 18:00 | 只看该作者
又见大师佳作

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
122
马上加薪
日期:2014-02-19 11:55:14ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-03-29 13:11:152010广州亚运会纪念徽章:篮球
日期:2011-02-20 22:50:172011新春纪念徽章
日期:2011-02-18 11:42:492011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
12#
 楼主| 发表于 2007-5-16 21:27 | 只看该作者
最初由 ZALBB 发布
[B]

此东东有没有BUG,别满心欢喜的用了之后,却发现它的执行计划与实际索引的不一样? [/B]


oracle EM中的tuning pack里的index advisor功能就是基于该特性的,有没有bug就不好说了,呵呵

毕竟,这给了我们一个不创建真实索引而判断是否需要建立索引的一个方法,利弊就需要在使用的时候权衡了

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
13#
发表于 2007-5-17 08:25 | 只看该作者
收藏一下,好像toad的sql tuning 可以使用这项功能,自己没有仔细研究。

谢谢!

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
14#
发表于 2007-5-17 08:30 | 只看该作者
>RBO使用hint可以使用虚拟索引
个人使用hint可以应该是cbo

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
122
马上加薪
日期:2014-02-19 11:55:14ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-03-29 13:11:152010广州亚运会纪念徽章:篮球
日期:2011-02-20 22:50:172011新春纪念徽章
日期:2011-02-18 11:42:492011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
15#
 楼主| 发表于 2007-5-17 08:59 | 只看该作者
最初由 lfree 发布
[B]>RBO使用hint可以使用虚拟索引
个人使用hint可以应该是cbo [/B]


RBO和CBO下使用hint都可以。只是因为RBO如果不使用hint则无效,所以这里特别列出来了

使用道具 举报

回复
论坛徽章:
59
狮子座
日期:2016-03-26 13:35:402013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-02-25 11:06:15ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20灰彻蛋
日期:2012-04-25 13:19:33紫蛋头
日期:2012-03-14 11:16:09最佳人气徽章
日期:2012-03-13 17:39:18玉石琵琶
日期:2012-02-21 15:04:38鲜花蛋
日期:2011-11-30 14:13:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
16#
发表于 2007-5-17 14:39 | 只看该作者
圈圈同志厉害的!
收藏了

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
17#
发表于 2007-5-18 10:03 | 只看该作者
昨天跟踪了toad带的sql tuning,实际上也是使用同样的方式。
实际上使用这种方式对于优化还是很有好处的。

看来自己学习还是不够认真。

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
18#
发表于 2007-5-18 10:47 | 只看该作者
如果建立后忘记删除,如何寻找呢?
好像仅仅可以通过这个确定。

select owner||object_name from dba_objects where object_type='INDEX'
minus
select owner||index_name from dba_indexes

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
122
马上加薪
日期:2014-02-19 11:55:14ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-03-29 13:11:152010广州亚运会纪念徽章:篮球
日期:2011-02-20 22:50:172011新春纪念徽章
日期:2011-02-18 11:42:492011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
19#
 楼主| 发表于 2007-5-18 11:22 | 只看该作者
通过sql trace可以知道,虚拟索引只在三张表中插了数据:obj$,icol$和ind$,由于不创建实际的segment,所以seg$不会有记录

所以通过dba_objects minus dba_indexes来查找是可以的,dba_indexes中的数据是已经关联了seg$的结果

使用道具 举报

回复
论坛徽章:
16
数据库板块每日发贴之星
日期:2007-05-10 01:02:022012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262011新春纪念徽章
日期:2011-02-18 11:43:352010广州亚运会纪念徽章:乒乓球
日期:2010-10-14 10:59:16ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25数据库板块每日发贴之星
日期:2010-05-09 01:01:01数据库板块每日发贴之星
日期:2010-03-14 01:01:09数据库板块每日发贴之星
日期:2007-11-13 01:04:45ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
20#
发表于 2007-5-20 16:43 | 只看该作者

Re: 关于虚拟索引(Virtual Index)

最初由 NinGoo 发布
[B]在数据库优化中,索引的重要性不言而喻。但是,在性能调整过程中,一个索引是否能被查询用到,在索引创建之前是无法确定的,而创建索引是一个代价比较高的操作,尤其是数据量较大的时候。

虚拟索引不是物理存在的,它并不会创建实际的索引段,只是在数据字典中加了一个索引的记录,使得优化器能够意识到一个索引的存在,从而判断是否使用该索引作为访问路径。当然,实际上最终查询的访问路径是不会使用该虚拟索引的。

所以,虚拟索引的用处就是用来判断一个索引对于sql的执行计划的影响,尤其是对整个数据库的影响,从而判断是否需要创建物理索引。

oracle文档中并没有提到虚拟索引的创建语法,实际上就是普通索引语法后面加一个nosegment关键字即可,B*Tree index和bitmap index都可以。

不同版本的虚拟索引的特性可能不一样,本文的例子执行环境为:
[php]
NING@ning>select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
--
[/php]
1.创建虚拟索引
[php]
NING@ning>create table test(id int,name varchar2(30));

Table created.

NING@ning>insert into test select rownum,object_name from all_objects where rownum<1001;

1000 rows created.

NING@ning>commit;

Commit complete.

NING@ning>create unique index ix_test on test(id) nosegment;

Index created.

NING@ning>analyze table test compute statistics;

Table analyzed.
--
[/php]
2.使用虚拟索引
[php]
NING@ning>explain plan for select * from test where id=1;

Explained.

NING@ning>select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1357081020

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    17 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TEST |     1 |    17 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
[/php]
必须设置隐含参数"_use_nosegment_indexes"=true(默认为false)后,CBO才能使用虚拟索引ix_test
[php]
NING@ning>alter session set "_use_nosegment_indexes"=true;

Session altered.

NING@ning>select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
Plan hash value: 166686173

---------------------------------------------------------------------------------------
| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |         |     1 |    17 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST    |     1 |    17 |     2   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | IX_TEST |     1 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------
[/php]
RBO无法使用虚拟索引
[php]
NING@ning>alter session set optimizer_mode=rule;

Session altered.

NING@ning>explain plan for select * from test where id=1;

Explained.

NING@ning>select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
-----------------------------------------------------------
Plan hash value: 1357081020

----------------------------------
| Id  | Operation         | Name |
----------------------------------
|   0 | SELECT STATEMENT  |      |
|*  1 |  TABLE ACCESS FULL| TEST |
----------------------------------
[/php]
RBO使用hint可以使用虚拟索引
[php]
NING@ning>explain plan for select /*+ index(test,ix_test)*/* from test where id=1;

Explained.

NING@ning>select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash value: 166686173

---------------------------------------------------------------------------------------
| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |         |     1 |    17 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST    |     1 |    17 |     2   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | IX_TEST |     1 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------
[/php]
3.虚拟索引的特性

无法执行alter index
[php]
NING@ning>alter index ix_test rebuild;
alter index ix_test rebuild
*
ERROR at line 1:
ORA-08114: can not alter a fake index

NING@ning>alter index ix_test rename to ix_test2;
alter index ix_test rename to ix_test2
*
ERROR at line 1:
ORA-08114: can not alter a fake index
--
[/php]
不能创建和虚拟索引同名的实际索引
[php]
NING@ning>create index ix_test on test(name);
create index ix_test on test(name)
             *
ERROR at line 1:
ORA-00955: name is already used by an existing object
--
[/php]
可以创建和虚拟索引包含相同列但不同名的实际索引
[php]
NING@ning>create index ix_test2 on test(id);

Index created.
--
[/php]
在10g使用回收站特性的时候,虚拟索引必须显式drop,或者在drop table后purge table后,才能创建同名的索引
[php]
NING@ning>drop table test;

Table dropped.

NING@ning>create unique index ix_test on test2(id);
create unique index ix_test on test2(id)
                    *
ERROR at line 1:
ORA-00955: name is already used by an existing object

NING@ning>drop index ix_test;
drop index ix_test
           *
ERROR at line 1:
ORA-38301: can not perform DDL/DML over objects in Recycle Bin

NING@ning>purge table test;

Table purged.

NING@ning>create unique index ix_test on test2(id);

Index created.
--
[/php] [/B]



NING@ning>create unique index ix_test on test(id) nosegment;
这个是建立虚拟索引的关键字吗?
请问是针对11G的吗

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表