ITPub博客

首页 > 数据库 > Oracle > 如何使用不可见索引测试查询性能以及不可见索引特性

如何使用不可见索引测试查询性能以及不可见索引特性

原创 Oracle 作者:呱呱牛 时间:2016-06-22 16:16:10 0 删除 编辑
在oracle11.2中,数据库允许关闭索引,使其不可见,但是索引上面的维护工作还是继续的,包括任何DML操作。当如何确定一个索引是否真正地被需要时,就可以通过设置为不可见来判断SQL执行计划。
语法:   
  1. alter index idx1 invisible;    
  2. alter index idx1 visible;   
  3. create index  ... invisible;
通过测试来说明下不可见索引的使用,通过是user_ind_columns 确定表EMP2 没有任何索引,其中数据共计108条
点击(此处)折叠或打开
  1. SQL> select table_name,index_name,column_name,column_position from user_ind_columns where table_name = 'EMP2';
  2. no rows selected
  3. SQL> select count(*) from emp2;
  4. COUNT(*)
  5. ----------
  6. 108
对表EMP2的job_id 列创建不可见索引,并确定JOB_ID的可以选择性

点击(此处)折叠或打开

  1. SQL> create index idx_emp2_jobid on hr.emp2(job_id) invisible;
  2. Index created.
  3. SQL> select table_name,index_name,column_name,column_position from user_ind_columns where table_name = 'EMP2';
  4. TABLE_NAME INDEX_NAME      COLUMN_NAME   COLUMN_POSITION 
  5. ------------------------------ ------------------------------
  6. EMP2     IDX_EMP2_JOBID        JOB_ID              1

  7. SQL> select distinct job_id from hr.emp2;

    JOB_ID
    ----------
    IT_PROG
    AD_ASST
    SA_MAN
    MK_REP
    AD_PRES
    SA_REP
    AC_MGR
    AC_ACCOUNT
    ST_MAN
    PU_MAN
    SH_CLERK
    AD_VP
    FI_ACCOUNT
    MK_MAN
    PR_REP
    FI_MGR
    PU_CLERK
    HR_REP
    ST_CLERK

    19 rows selected.

查询执行计划1,未使用新建索引
点击(此处)折叠或打开
  1. SQL> select count(*) from hr.emp2 where job_id = 'MK_REP';
  2. Execution Plan
  3. ----------------------------------------------------------
  4. Plan hash value: 2889146209

  5. Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2889146209

    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     1 |     9 |     3   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE    |      |     1 |     9 |            |          |
    |*  2 |   TABLE ACCESS FULL| EMP2 |     6 |    54 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
  6. Predicate Information (identified by operation id):
  7. ---------------------------------------------------
  8. 2 - filter("JOB_ID"='MK_REP')

  9. Statistics
  10. ----------------------------------------------------------
             52  recursive calls
              0  db block gets
             56  consistent gets
              0  physical reads
              0  redo size
            526  bytes sent via SQL*Net to client
            524  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              6  sorts (memory)
              0  sorts (disk)
              1  rows processed

通过使用hints   use_invisible_indexes提示查看执行计划,使用了索引IDX_EMP2_JOBID 
点击(此处)折叠或打开
  1. SQL> select /*+ use_invisible_indexes */ count(*) from hr.emp2 where job_id = 'MK_REP';

  2. Execution Plan
  3. ----------------------------------------------------------
  4. Plan hash value: 3396120133
  5. ------------------------------------------------------------------------------------
    | Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |                |     1 |     9 |     1   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE   |                |     1 |     9 |            |          |
    |*  2 |   INDEX RANGE SCAN| IDX_EMP2_JOBID |     6 |    54 |     1   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
  6. ---------------------------------------------------
  7. 2 - access("JOB_ID"='MK_REP')
  8. Statistics
    ----------------------------------------------------------
              1  recursive calls
              0  db block gets
              1  consistent gets
              0  physical reads
              0  redo size
            526  bytes sent via SQL*Net to client
            524  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed


最后把索引IDX_EMP2_JOBID 设置为可见,查看执行计划使用了索引。

点击(此处)折叠或打开

  1. SQL> alter index idx_emp2_jobid visible;
  2. Index altered.
  3. SQL> select count(*) from hr.emp2 where job_id = 'MK_REP';
  4. Execution Plan
  5. ----------------------------------------------------------
  6. Plan hash value: 3396120133
  7. ------------------------------------------------------------------------------------
  8. | Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |                |     1 |     9 |     1   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE   |                |     1 |     9 |            |          |
    |*  2 |   INDEX RANGE SCAN| IDX_EMP2_JOBID |     6 |    54 |     1   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------

  9. Predicate Information (identified by operation id):
  10. ---------------------------------------------------
  11. 2 - access("JOB_ID"='MK_REP')

  12. Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              1  consistent gets
              0  physical reads
              0  redo size
            526  bytes sent via SQL*Net to client
            524  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed

通过使用不可见索引,临时“关闭”他们来测试查询没有他们时候的执行性能。由于不可见索引一直在维护的,如果需要他们就可以轻易把他们“打开”,使他们可见。这是使用不可见索引的要诀。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27039319/viewspace-2120716/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-05-29

  • 博文量
    96
  • 访问量
    286795