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

简介: [20130815]关于虚拟索引的问题.txt虚拟索引建立并没有占用磁盘空间,主要用来评估建立的索引是否可用。但是存在一个问题,如果建立了这样的索引,dba如何知道目前数据库存在那些虚拟索引,做一个例子来说明:1.
[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视图)。




目录
相关文章
|
SQL 测试技术 索引
[20180509]函数索引问题.txt
[20180509]函数索引问题.txt https://jonathanlewis.wordpress.com/2018/05/07/fbis-dont-exist/ --//重复测试: 1.
1127 0
|
关系型数据库 Linux 索引
[20180212]函数索引问题.txt
[20180212]函数索引问题.txt --//11g下,如果函数索引,字段出现重复,出现ORA-54015: Duplicate column expression was specified.
998 0
|
Oracle 关系型数据库
[20171203]平均长度和虚拟列.txt
[20171203]平均长度和虚拟列.txt --//昨天看链接https://blog.dbi-services.com/doag-2017-avg_row_len-with-virtual-columns/ --//重复测试看看.
947 0
|
索引 关系型数据库 Oracle
[20171202]关于函数索引的状态.txt
[20171202]关于函数索引的状态.txt --//我曾经在一篇贴子提到索引可以disable吗?链接: --//http://blog.itpub.net/267265/viewspace-2123537/ --//实际上仅仅函数索引能disable,为什么呢?实际上自己以前并不搞清楚实际上这个跟oracle使用函数的特殊性有关.
1238 0
|
SQL 索引 关系型数据库
|
存储 SQL Oracle
Oracle之虚拟列及虚拟列索引
Oracle之虚拟列及虚拟列索引 1. 为什么要使用虚拟列        (1)可以为虚拟列创建索引(oracle为其创建function index)        (2)可以搜集虚拟列的统计信息statistics,为CBO提供一定的采样分析。
1406 0
|
Oracle 关系型数据库 数据库管理
[20170209]索引范围访问2.txt
[20170209]索引范围访问2.txt --ITPUB网友问的问题: http://www.itpub.net/thread-2083504-1-1.html --索引范围扫描是如何访问数据块的? 1 FOR  (根节点-> 分支节点->叶节点->...
696 0
|
索引 关系型数据库 Oracle
[20170210]索引范围扫描3.txt
[20170210]索引范围扫描3.txt --昨天写了一篇索引范围扫描文章,链接:http://blog.itpub.net/267265/viewspace-2133289/ --才想起来我以前理解的一个错误,链接:http://blog.
830 0
|
Oracle 关系型数据库 物联网
[20160908]唯一索引与非唯一索引.txt
[20160908]唯一索引与非唯一索引.txt --唯一索引与非唯一索引的区别在于rowid信息在索引的位置,唯一索引rowid在row header(数据部分).而非唯一索引在最后.
767 0