[20130815]关于虚拟索引的问题.txt

[20130815]关于虚拟索引的问题.txt

虚拟索引建立并没有占用磁盘空间,主要用来评估建立的索引是否可用。但是存在一个问题,如果建立了这样的索引,
dba如何知道目前数据库存在那些虚拟索引,做一个例子来说明:

1.建立测试环境:

SQL> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

SQL> create table t (a number,b number,c varchar2(10));
Table created.

SQL> insert into t values (1,2,'a');
1 row created.

SQL> commit ;
Commit complete.

SQL> create index i_t_a on t(a);
Index created.

SQL> create index i_t_b on t(b) nosegment;
Index created.

--建立两个索引,其中i_t_b为虚拟索引。

2.查询看看建立了那些索引在表T上。

SQL> select index_name,owner from dba_indexes where index_name like 'I_T_%' and wner=user;
INDEX_NAME                     OWNER
------------------------------ ------
I_T_A                          SCOTT

--可以发现仅仅看到在a字段的索引。

SQL> create index i_t_b on t(b) ;
create index i_t_b on t(b)
             *
ERROR at line 1:
ORA-00955: name is already used by an existing object

SQL> create index i_t_bx on t(b) ;
Index created.

SQL> select index_owner,index_name,column_name,table_name from dba_ind_columns where index_name like 'I_T_%' and table_owner=user;
INDEX_OWNER                    INDEX_NAME                     COLUMN_NAME          TABLE_NAME
------------------------------ ------------------------------ -------------------- ----------
SCOTT                          I_T_A                          A                    T
SCOTT                          I_T_B                          B                    T
SCOTT                          I_T_BX                         B                    T

--查询dba_ind_columns视图可以知道。可以发现一个奇怪的情况B字段存在两个索引。

--有什么方法知道当前的数据库建立了虚拟索引呢?

SQL> select object_name,object_id,data_object_id,object_type from dba_objects where object_name in ('I_T_A','I_T_B','I_T_BX');
OBJECT_NAME           OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
-------------------- ---------- -------------- -------------------
I_T_A                    273812         273812 INDEX
I_T_B                    273813         273813 INDEX
I_T_BX                   273815         273815 INDEX
SQL> SELECT obj#, dataobj#, ts#, file#, block#, bo#, flags  FROM SYS.ind$ WHERE obj# IN (273812, 273813, 273815);
      OBJ#   DATAOBJ#        TS#      FILE#     BLOCK#        BO#      FLAGS
---------- ---------- ---------- ---------- ---------- ---------- ----------
    273812     273812          4          4        530     273811          2
    273813     273813          4          0          0     273811       4096
    273815     273815          4          4        538     273811          2

-- 对比可以看出查询flags=4096 ,才是虚拟索引。其他file#=0,block#=0 ,不能作为判断的依据。

--看来仅仅查询:

SQL> SELECT obj#, dataobj#, ts#, file#, block#, bo#, flags  FROM SYS.ind$ WHERE flags=4096;
      OBJ#   DATAOBJ#        TS#      FILE#     BLOCK#        BO#      FLAGS
---------- ---------- ---------- ---------- ---------- ---------- ----------
    273813     273813          4          0          0     273811       4096

--通过obj#,dataobj#来查询dba_objects,知道那个索引是虚拟索引,再查询dba_ind_columns(不能查dba_indexes视图)。

时间: 2024-07-29 21:39:47

[20130815]关于虚拟索引的问题.txt的相关文章

ORACLE虚拟索引(Virtual Index)

ORACLE虚拟索引(Virtual Index)   虚拟索引概念   虚拟索引(Virtual Indexes)是一个定义在数据字典中的假索引(fake index),它没有相关的索引段.虚拟索引的目的是模拟索引的存在而不用真实的创建一个完整索引.这允许开发者创建虚拟索引来查看相关执行计划而不用等到真实创建完索引才能查看索引对执行计划的影响,并且不会增加存储空间的使用.如果我们观察到优化器生成了一个昂贵的执行计划并且SQL调整指导建议我们对某些的某列创建索引,但在生产数据库环境中创建索引与测

[20171202]关于函数索引的状态.txt

[20171202]关于函数索引的状态.txt --//我曾经在一篇贴子提到索引可以disable吗?链接: --//http://blog.itpub.net/267265/viewspace-2123537/ --//实际上仅仅函数索引能disable,为什么呢?实际上自己以前并不搞清楚实际上这个跟oracle使用函数的特殊性有关. --//如果一个表删除某个字段,对应的索引也会删除.如果定义的函数删除了,对应的函数索引呢?通过例子来说明问题: 1.环境: SCOTT@test01p> @

[20150304]唯一索引与阻塞.txt

[20150304]唯一索引与阻塞.txt --昨天帮别人定位一个唯一索引导致出现ora-00001的问题,实际上很简单,程序使用max(id)取得最大号,然后插入,这样的结果在业务 --高峰,出现阻塞或者ora-00001错误.我仅仅简单做一下跟踪很容易定位这个问题. --换一个角度,使用别的方法是否可行呢,自己做一个例子来验证看看. 1.建立测试环境: SCOTT@test> create table t as select rownum id,cast ( 'test' as varcha

[20150626]建立索引pctfree=0.txt

[20150626]建立索引pctfree=0.txt --昨天看了链接: https://richardfoote.wordpress.com/2015/06/25/quiz-time-why-do-deletes-cause-an-index-to-grow-up-the-hill-backwards/ --自己测试看看来解答问题,不知道是否正确:-) 1.建立测试环境: SCOTT@test> @ver1 PORT_STRING                    VERSION    

[20150926]索引压缩问题.txt

[20150926]索引压缩问题.txt --以前如果索引前缀重复值很多,我会选择索引压缩,这样减少磁盘空间占用,索引范围扫描也可以减少磁盘IO,虽然这样可能消耗一些 --CUP资源,感觉影响不大. --看了链接感觉自己忽略一些问题,可能导致达不到预期效果. --通过例子来说明: 1.建立测试环境: SCOTT@test01p> @ver1 PORT_STRING                    VERSION        BANNER                          

[20131013]索引部分数据.txt

[20131013]索引部分数据.txt 在实际的生产系统中,比如一个标识状态的字段,'0'的行很少,'1'以及其他值的行很多,一个通过特殊的函数索引,利用oracle索引不保存NULL的特性(注意如果索引2个字段,2个必须为NULL,索引才不会保存),索引仅仅为'0',减少索引的大小,实际上网上有许多的例子,正好别人问到,顺手写一个小例子: 1.建立测试例子: SCOTT@test01p> @ver BANNER                                         

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

http://www.itpub.net/showthread.php?s=&postid=7523115#post7523115 在数据库优化中,索引的重要性不言而喻.但是,在性能调整过程中,一个索引是否能被查询用到,在索引创建之前是无法确定的,而创建索引是一个代价比较高的操作,尤其是数据量较大的时候. 虚拟索引不是物理存在的,它并不会创建实际的索引段,只是在数据字典中加了一个索引的记录,使得优化器能够意识到一个索引的存在,从而判断是否使用该索引作为访问路径.当然,实际上最终查询的访问路径是不

[20121015]探索索引-学习bbed.txt

[20121015]探索索引-学习bbed.txt 参考链接:http://www.adellera.it/blog/2009/05/24/order-keys-inside-index-blocks/ 1.探索索引 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Ent

[20131015]关于索引块分裂.txt

[20131015]关于索引块分裂.txt 前几天看了链接:http://www.askmaclean.com/archives/index-split.html 提到:oracle中的索引块分裂主要分成 以下几种:     leaf node 90-10 splits    leaf node 50-50 splits    branch node splits    root node splits 按照 leaf Block Split 分裂时的行为 又可以分为: leaf node 90