`

oracle11g 不可见索引

 
阅读更多
索引维护是DBA的一项重要工作。当一个系统运行很长一段时间,经过需求变更、结构设计变化后,系统中就可能会存在一些不会被使用的索引,或者使用效率很低的索引。这些索

引的存在,不仅占用系统空间,而且会降低事务效率,增加系统的waits。因此,我们需要找出那些无用或低效索引的索引并删除它们(找出无用索引可以通过索引监控 的方法)

。但是,直接删除索引还是存在一定风险的。例如,某些索引可能只是在一些周期的作业中被使用到,而如果监控周期没有覆盖到这些作业的触发点,就会认为索引是无用的而被

删除。当作业启动后,可能就会对系统性能造成冲击。这时,可能就会手忙脚乱的去找回索引定义语句、重建索引。
    11G之前,我们可以先不删除索引,而将其修改为unusable。这样的话,索引的定义并未删除,只是索引不能再被使用也不会随着表数据的更新而更新。当需要重新使用该索引

时,需要用rebuild语句重建、然后更新统计信息。对于一些大表来说,这个时间可能就非常长。
    在11g里,Oracle 提供了一个新的特性来降低直接删除索引或者禁用索引的风险,那就是索引不可见(Index Invisible)。我们可以在创建索引时指定invisible属性或者用

alter语句来修改索引为invisible。
在session级别设置参数optimizer_use_invisible_indexes为true,系统就可以使用invisible索引。
alter session set optimizer_use_invisible_indexes=true;

SQL代码

LIBIN@tran>select count(*) from all_objects;

  COUNT(*)
----------
     55622

LIBIN@tran>create table t_test1 as select * from all_objects;

表已创建。

LIBIN@tran>desc all_objects;
名称                                                                                                          
-----------------------------------------------------------------------------------------------------------
OWNER                                                                                                         
OBJECT_NAME                                                                                                   
SUBOBJECT_NAME                                                                                                
OBJECT_ID                                                                                                     
DATA_OBJECT_ID                                                                                                
OBJECT_TYPE                                                                                                   
CREATED                                                                                                       
LAST_DDL_TIME                                                                                                 
TIMESTAMP                                                                                                     
STATUS                                                                                                        
TEMPORARY                                                                                                     
GENERATED                                                                                                     
SECONDARY                                                                                                     
NAMESPACE                                                                                                     
EDITION_NAME                                                                                                  

LIBIN@tran>create index t_test1_idx on t_test1(object_name);

索引已创建。

LIBIN@tran>begin
  2  dbms_stats.gather_table_stats(user,'t_test1');
  3  end;
  4  /

PL/SQL 过程已成功完成。

LIBIN@tran>set autotrace trace only;
SP2-0158: 未知的 SET 选项 "only"
LIBIN@tran>set autotrace traceonly;

LIBIN@tran>select * from t_test1 where object_name like 'LIBIN%';

未选定行


执行计划
----------------------------------------------------------
Plan hash value: 3466041839

-------------------------------------------------------------------------------------------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |     2 |   196 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T_TEST1     |     2 |   196 |     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T_TEST1_IDX |     2 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_NAME" LIKE 'LIBIN%')
       filter("OBJECT_NAME" LIKE 'LIBIN%')


统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
       1124  bytes sent via SQL*Net to client
        389  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

LIBIN@tran>


LIBIN@tran>select index_name,user_stats,visibility from user_indexes where index_name='T_TEST1_IDX';

INDEX_NAME                                                   USER_S VISIBILITY
------------------------------------------------------------ ------ ------------------
T_TEST1_IDX                                                  NO     VISIBLE

LIBIN@tran>


LIBIN@tran>alter index t_test1_idx invisible;

索引已更改。

LIBIN@tran>select index_name,user_stats,visibility from user_indexes where index_name='T_TEST1_IDX';

INDEX_NAME                                                   USER_S VISIBILITY
------------------------------------------------------------ ------ ------------------
T_TEST1_IDX                                                  NO     INVISIBLE

LIBIN@tran>

LIBIN@tran>select * from t_test1 where object_name like 'LIBIN%';

未选定行


执行计划
----------------------------------------------------------
Plan hash value: 1883417357

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |     2 |   196 |   226   (1)| 00:00:03 |
|*  1 |  TABLE ACCESS FULL| T_TEST1 |     2 |   196 |   226   (1)| 00:00:03 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("OBJECT_NAME" LIKE 'LIBIN%')


统计信息
----------------------------------------------------------
        253  recursive calls
          0  db block gets
        869  consistent gets
          4  physical reads
          0  redo size
       1124  bytes sent via SQL*Net to client
        389  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
          0  rows processed

LIBIN@tran>



LIBIN@tran>alter index t_test1_idx visible;

索引已更改。


LIBIN@tran>select index_name,user_stats,visibility from user_indexes where index_name='T_TEST1_IDX';

INDEX_NAME                                                   USER_S VISIBILITY
------------------------------------------------------------ ------ ------------------
T_TEST1_IDX                                                  NO     VISIBLE


LIBIN@tran>explain plan for select /*+ index(t_test1 t_test1_idx)  */ * from t_test1 where object_name like 'LIBIN%';

已解释。

LIBIN@tran>select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------
Plan hash value: 3466041839

-------------------------------------------------------------------------------------------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |     2 |   196 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T_TEST1     |     2 |   196 |     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T_TEST1_IDX |     2 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_NAME" LIKE 'LIBIN%')
       filter("OBJECT_NAME" LIKE 'LIBIN%')

已选择15行。

LIBIN@tran>alter index t_test1_idx invisible;

索引已更改。

LIBIN@tran>select index_name,user_stats,visibility from user_indexes where index_name='T_TEST1_IDX';

INDEX_NAME                                                   USER_S VISIBILITY
------------------------------------------------------------ ------ ------------------
T_TEST1_IDX                                                  NO     INVISIBLE

LIBIN@tran>explain plan for select /*+ index(t_test1 t_test1_idx)  */ * from t_test1 where object_name like 'LIBIN%';

已解释。

LIBIN@tran>select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------
Plan hash value: 1883417357

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |     2 |   196 |   226   (1)| 00:00:03 |
|*  1 |  TABLE ACCESS FULL| T_TEST1 |     2 |   196 |   226   (1)| 00:00:03 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("OBJECT_NAME" LIKE 'LIBIN%')

已选择13行。

LIBIN@tran>alter session set optimizer_use_invisible_indexes=true;

会话已更改。

LIBIN@tran>explain plan for select /*+ index(t_test1 t_test1_idx)  */ * from t_test1 where object_name like 'LIBIN%';

已解释。

LIBIN@tran>select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3466041839

-------------------------------------------------------------------------------------------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |     2 |   196 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T_TEST1     |     2 |   196 |     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T_TEST1_IDX |     2 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_NAME" LIKE 'LIBIN%')
       filter("OBJECT_NAME" LIKE 'LIBIN%')

已选择15行。

LIBIN@tran>select * from  t_test1 where object_name like 'LIBIN%';

未选定行

LIBIN@tran>select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3466041839

-------------------------------------------------------------------------------------------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |     2 |   196 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T_TEST1     |     2 |   196 |     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T_TEST1_IDX |     2 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_NAME" LIKE 'LIBIN%')
       filter("OBJECT_NAME" LIKE 'LIBIN%')

已选择15行。

LIBIN@tran>
分享到:
评论

相关推荐

    Oracle 11g新特性索引不可见

    Oracle 11g 中引入了一个新特性,称为索引不可见(Index Invisible),它允许 DBA 将索引设置为不可见状态,使得优化器在选择查询计划时忽视该索引,而不影响索引的正常更新。 索引维护是 DBA 的一项重要工作。在...

    oracle11g数据字典以及性能视图

    Oracle 11g 数据字典和性能视图是数据库管理员和开发人员进行高效数据库管理和优化的重要工具。在Oracle 11g中,数据字典是一系列预定义的系统表和视图,它们存储了关于数据库对象、用户权限、系统状态等关键信息。...

    oracle 11g overview

    4. **模式管理**:改进的模式管理使添加默认值的列变得更加简便,同时增加了对不可见索引、虚拟列和只读表的支持,增强了数据库的设计和维护能力。 5. **SQL计划管理**:通过绑定变量确保每次都能选择正确的执行...

    Oracle 11g 从入门到精通——第十章(视频教程)

    Oracle 11g支持多种类型的索引,如B树索引、位图索引、函数索引和全局分区索引等。B树索引是最常见的类型,适用于频繁查询的列。位图索引适用于值较少且查询涉及多列的情况。函数索引允许在索引中应用函数,而全局...

    Oracle_11g_面向DBA的新功能学习指南 less16

    - **不可见索引的应用场景**: - 在删除索引之前进行测试,观察对性能的影响。 - 对特定的操作或模块使用临时索引结构,以避免影响整个应用程序。 不可见的索引为DBA提供了一种灵活的方式来管理和测试索引,而不会...

    Oracle 数据库 11g:面向 DBA 和开发人员的重要特性

    - **不可见的索引**:在不改变查询行为的情况下,暂时隐藏索引。 - **虚拟列**:允许基于其他列的值计算出的列。 #### 八、SQL计划管理 **SQL计划管理**是一个新特性,旨在确保SQL执行计划的高效性和一致性。通过...

    Oracle数据库管理员指南-管理表-中文版.pdf Administrator's Guide Oracle Managing Tables

    例如,DBA_TABLES、ALL_TABLES和USER_TABLES视图分别提供了数据库管理员、当前用户和其他用户可见的表的信息。 在变更表结构时,管理员可能需要添加或删除列、更改列的数据类型,或者调整表的存储参数等。变更操作...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    12.5.1 不可见索引 355 12.5.2 虚拟索引 356 12.5.3 位图联结索引 357 12.6 小结 359 第13章 SELECT以外的内容 360 13.1 INSERT 360 13.1.1 直接路径插入 360 13.1.2 多表插入 363 13.1.3 条件插入 364 ...

    DBA成长之路(ORACLE)

    数据文件是Oracle数据库中极其重要的组成部分,它们主要用于存储数据库的所有数据,包括表数据以及索引数据。这些文件通常具有.dbf的扩展名。每个数据库实例可以包含多个数据文件,但是每一个数据文件只能属于一个表...

    oracle表空间管理

    尽管`MAXSIZE UNLIMITED`表明文件大小无限制,但在实际操作中,每个数据文件的大小仍有限制,例如在Oracle 11g中,最大值可能为32GB。 表空间的维护还包括确保数据文件的合理分布和I/O负载均衡,尤其是在RAC环境中...

    ORACLE10gNEWFEATURE

    Oracle 10g 的新特性之一是引入了回收站(Recycle Bin)功能,这是一个类似于操作系统回收站的设计,用于在数据库层面提供数据恢复的便捷方式。在 Oracle 10g 之前,如果用户误删了表,恢复过程相对复杂。但有了回收...

    OracleTemporaryTables(Oracle临时表).pdf

    - **索引和视图**:可以对临时表创建索引并基于临时表创建视图,但这些索引也是临时的,只对当前会话或事务有效。 - **触发器支持**:临时表可以拥有触发器,扩展了功能。 - **导入导出**:可以使用`EXPDP`和`...

    oracle_专家高级编程_中文第十章

    有序散列聚簇表是Oracle 10g引入的新特性,它结合了散列聚簇表和索引组织表的特点,行按照某个键值散列,并保持一定的有序性。这种结构适用于那些需要按先进先出原则处理数据的场景,如订单系统中的订单处理。 ### ...

Global site tag (gtag.js) - Google Analytics