文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

oracle性能调优-虚拟索引

2024-04-02 19:55

关注

一、引言

    DBA在日常维护管理数据库进行低性能SQL分析时,有时候需要通过创建索引对SQL进行优化,但有些时候我们创建的索引是否能用到?这个只能创建以后才能看出效果,但是在实际工作中,特别是对大表创建索引对系统性能有很大影响,因此我们不得不避开业务高峰时段,但是有没有一种办法创建索引而不影响性能呢?有,那就是虚拟索引。

    虚拟索引不是物理存在的,它并不会创建实际的索引段,只是在数据字典中加了一个索引的记录,使得优化器能够意识到一个索引的存在,从而判断是否使用该索引作为访问路径。作用仅仅是为了DBA作SQL优化时使用,DBA根据虚拟索引的优化效果决定是否创建物理索引。

二、虚拟索引类型

    虚拟索引支持B-TREE索引和BIT位图索引,在CBO模式下ORACLE优化器会考虑虚拟索引,但是在RBO模式下需要添加hint才行。

三、虚拟索引创建实例

SQL> create table scott.t as select * from dba_objects;

Table created.


SQL> alter session set "_use_nosegment_indexes"=true;

Session altered.


SQL> create index scott.ix_t_id on scott.t(object_id) nosegment;

Index created.


SQL> set autot traceonly

SQL> select * from scott.t where object_id=1;

no rows selected


Execution Plan

----------------------------------------------------------

Plan hash value: 206018885

---------------------------------------------------------------------------------------

| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

---------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |         |    14 |  2898 |     5   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| T       |    14 |  2898 |     5   (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | IX_T_ID |   330 |       |     1   (0)| 00:00:01 |

---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   2 - access("OBJECT_ID"=1)

Note

-----

   - dynamic sampling used for this statement (level=2)

Statistics

----------------------------------------------------------

          4  recursive calls

          0  db block gets

       1308  consistent gets

       1239  physical reads

          0  redo size

       1343  bytes sent via SQL*Net to client

        512  bytes received via SQL*Net from client

          1  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          0  rows processed


-- 以下看的是真实执行计划,显然是用不到索引。

SQL> set autot off

SQL> alter session set statistics_level=all;

Session altered.


SQL> select * from scott.t where object_id=1;

no rows selected


SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------------

SQL_ID  2qhwh0nzrzx2r, child number 1

-------------------------------------

select * from t where object_id=1

Plan hash value: 1601196873

---------------------------------------------------------------------------------------------

| Id  | Operation         | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |

---------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |      1 |        |      0 |00:00:00.52 |    1242 |   1239 |

|*  1 |  TABLE ACCESS FULL| T    |      1 |     14 |      0 |00:00:00.52 |    1242 |   1239 |

---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   1 - filter("OBJECT_ID"=1)

Note

-----

   - dynamic sampling used for this statement (level=2)

22 rows selected.


-- 从数据字段中是无法找到这个索引的。

SQL> select index_name,status from dba_indexes where table_name='T';

no rows selected


四、虚拟索引的特点

    4.1、虚拟索引无法执行alter index选项

SQL> alter index scott.IX_T_ID rebuild;

alter index scott.IX_T_ID rebuild

*

ERROR at line 1:

ORA-08114: can not alter a fake index

    4.2、使用回收站特性的时候,虚拟索引必须先drop,才能创建同名的索引。

SQL> drop table scott.t;

Table dropped.


SQL> flashback table scott.t to before drop;

Flashback complete.


SQL> create index scott.idx_t_id on scott.t(object_id) nosegment;

create index scott.idx_t_id on scott.t(object_id) nosegment

                  *

ERROR at line 1:

ORA-00955: name is already used by an existing object

oracle性能调优-虚拟索引

    4.3、不能创建和虚拟索引同名的实际索引;

    4.4、可以创建和虚拟索引包含相同列但不同名的实际索引;

    4.5、虚拟索引在数据字典里看不到


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯