ITPUB论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
更多
查看: 3422|回复: 25

[Tips] 关于虚拟索引(Virtual Index) [复制链接]

版主

何乡是吾乡,归期未有期

精华贴数
6
技术积分
13512
社区积分
4358
注册时间
2004-12-7
论坛徽章:
110
ITPUB元老
日期:2007-12-12 18:09:57八级虎吧徽章
日期:2008-12-08 16:10:56生肖徽章2007版:狗
日期:2009-01-15 19:45:13生肖徽章2007版:龙
日期:2009-09-16 13:11:59祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:蛇
日期:2009-11-13 10:54:512010数据库技术大会纪念徽章
日期:2010-05-13 10:04:282011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56
发表于 2007-5-16 11:29:06 |显示全部楼层
在数据库优化中,索引的重要性不言而喻。但是,在性能调整过程中,一个索引是否能被查询用到,在索引创建之前是无法确定的,而创建索引是一个代价比较高的操作,尤其是数据量较大的时候。

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

所以,虚拟索引的用处就是用来判断一个索引对于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]

注册会员

10g OCM

精华贴数
4
技术积分
9973
社区积分
6261
注册时间
2002-4-5
论坛徽章:
16
ITPUB元老
日期:2005-04-12 20:54:27授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
发表于 2007-5-16 14:55:20 |显示全部楼层
Is virtual index first introduced in oracle 10g release 2?

使用道具 举报

版主

何乡是吾乡,归期未有期

精华贴数
6
技术积分
13512
社区积分
4358
注册时间
2004-12-7
论坛徽章:
110
ITPUB元老
日期:2007-12-12 18:09:57八级虎吧徽章
日期:2008-12-08 16:10:56生肖徽章2007版:狗
日期:2009-01-15 19:45:13生肖徽章2007版:龙
日期:2009-09-16 13:11:59祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:蛇
日期:2009-11-13 10:54:512010数据库技术大会纪念徽章
日期:2010-05-13 10:04:282011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56
发表于 2007-5-16 14:57:39 |显示全部楼层
No, you can use this feature in 9i or some other versions. I do not know exactly which version  instroduced this function.Because it's undocumented.

使用道具 举报

注册会员

10g OCM

精华贴数
4
技术积分
9973
社区积分
6261
注册时间
2002-4-5
论坛徽章:
16
ITPUB元老
日期:2005-04-12 20:54:27授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
发表于 2007-5-16 15:04:03 |显示全部楼层
undocumented in any version?
i do not like some features which are undocumented.Obviously, Oracle does not recommend we use the technology which is undocumented.

使用道具 举报

版主

何乡是吾乡,归期未有期

精华贴数
6
技术积分
13512
社区积分
4358
注册时间
2004-12-7
论坛徽章:
110
ITPUB元老
日期:2007-12-12 18:09:57八级虎吧徽章
日期:2008-12-08 16:10:56生肖徽章2007版:狗
日期:2009-01-15 19:45:13生肖徽章2007版:龙
日期:2009-09-16 13:11:59祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:蛇
日期:2009-11-13 10:54:512010数据库技术大会纪念徽章
日期:2010-05-13 10:04:282011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56
发表于 2007-5-16 15:16:22 |显示全部楼层
Yeah, it's undocumented. But oracle uses it with OEM tuning pack.

使用道具 举报

精华贴数
8
技术积分
49197
社区积分
22305
注册时间
2001-10-15
论坛徽章:
184
蜘蛛蛋
日期:2012-02-03 17:20:24迷宫蛋
日期:2011-12-20 08:39:39茶鸡蛋
日期:2011-12-01 22:49:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41咸鸭蛋
日期:2012-01-06 16:55:17蜘蛛蛋
日期:2011-10-20 15:51:252012新春纪念徽章
日期:2012-01-04 11:49:54迷宫蛋
日期:2011-10-29 11:12:59复活蛋
日期:2011-12-14 09:37:30灰彻蛋
日期:2011-12-30 14:51:36ITPUB年度最佳版主
日期:2011-12-28 15:24:18紫蛋头
日期:2011-08-31 10:57:28
发表于 2007-5-16 16:50:17 |显示全部楼层
NinGoo 好样的!

使用道具 举报

精华贴数
8
技术积分
49197
社区积分
22305
注册时间
2001-10-15
论坛徽章:
184
蜘蛛蛋
日期:2012-02-03 17:20:24迷宫蛋
日期:2011-12-20 08:39:39茶鸡蛋
日期:2011-12-01 22:49:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41咸鸭蛋
日期:2012-01-06 16:55:17蜘蛛蛋
日期:2011-10-20 15:51:252012新春纪念徽章
日期:2012-01-04 11:49:54迷宫蛋
日期:2011-10-29 11:12:59复活蛋
日期:2011-12-14 09:37:30灰彻蛋
日期:2011-12-30 14:51:36ITPUB年度最佳版主
日期:2011-12-28 15:24:18紫蛋头
日期:2011-08-31 10:57:28
发表于 2007-5-16 16:53:24 |显示全部楼层
不过有个问题,虚拟索引能否被分析,统计柱状图信息?

若不可以,是否因此而与实际索引在使用时,得到不一样的执行计划。

使用道具 举报

版主

何乡是吾乡,归期未有期

精华贴数
6
技术积分
13512
社区积分
4358
注册时间
2004-12-7
论坛徽章:
110
ITPUB元老
日期:2007-12-12 18:09:57八级虎吧徽章
日期:2008-12-08 16:10:56生肖徽章2007版:狗
日期:2009-01-15 19:45:13生肖徽章2007版:龙
日期:2009-09-16 13:11:59祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:蛇
日期:2009-11-13 10:54:512010数据库技术大会纪念徽章
日期:2010-05-13 10:04:282011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56
发表于 2007-5-16 17:06:18 |显示全部楼层
最初由 ZALBB 发布
[B]不过有个问题,虚拟索引能否被分析,统计柱状图信息?

若不可以,是否因此而与实际索引在使用时,得到不一样的执行计划。 [/B]


可以分析并且有效,但是数据字典里查不到结果,估计是oracle内部临时保存了分析结果

使用道具 举报

精华贴数
8
技术积分
49197
社区积分
22305
注册时间
2001-10-15
论坛徽章:
184
蜘蛛蛋
日期:2012-02-03 17:20:24迷宫蛋
日期:2011-12-20 08:39:39茶鸡蛋
日期:2011-12-01 22:49:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41咸鸭蛋
日期:2012-01-06 16:55:17蜘蛛蛋
日期:2011-10-20 15:51:252012新春纪念徽章
日期:2012-01-04 11:49:54迷宫蛋
日期:2011-10-29 11:12:59复活蛋
日期:2011-12-14 09:37:30灰彻蛋
日期:2011-12-30 14:51:36ITPUB年度最佳版主
日期:2011-12-28 15:24:18紫蛋头
日期:2011-08-31 10:57:28
发表于 2007-5-16 17:44:22 |显示全部楼层
最初由 NinGoo 发布
[B]

可以分析并且有效,但是数据字典里查不到结果,估计是oracle内部临时保存了分析结果 [/B]


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

使用道具 举报

注册会员

10g OCM

精华贴数
4
技术积分
9973
社区积分
6261
注册时间
2002-4-5
论坛徽章:
16
ITPUB元老
日期:2005-04-12 20:54:27授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
发表于 2007-5-16 17:45:14 |显示全部楼层
梢苑治霾⑶矣行В鞘葑值淅锊椴坏浇峁兰剖莖racle内部临时保存了分析结果??
it is my IE 's issue or your PC's language setting?

使用道具 举报

相关内容推荐
您需要登录后才可以回帖 登录 | 注册

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 邮箱 虎吧 老博客 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
回顶部