且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

LOCAL INDEX和HINT的使用【DO BE USED LOCAL INDEX IN HINT】

更新时间:2022-10-01 13:10:51

   今晚(当然还差14分钟就到明天了),对一张有19956517条记录的表进行特定SQL的优化操作。问题很快解决,原本需要56秒到1分半左右得到结果集的SQL,现在小于0.3秒。其实问题很简单,分裂(SPLIT)PARTITION后,没有及时更新本地索引!【如果有兴趣可以看看我写的有关分区SPLIT的博文】
    该表有一个MESSAGE_ID作为主键,还有一个terminal_id字段的本地索引。
    完成后,突然想看看COUNT全表数据性能如何。几经周折无大的提高。
    后来想使用HINT得到突破,但是却有些另外的发现。
    SQL> SELECT /*+ index (XXX_LOG INX__LOG_001)*/count(TERMINAL_ID) FROM XXX_LOG ;

Execution Plan
----------------------------------------------------------
Plan hash value: 1657932776
---------------------------------------------------------------
| Id  | Operation              | Name          | Rows  | Bytes 
---------------------------------------------------------------
|   0 | SELECT STATEMENT       |               |     1 |    13 
|   1 |  SORT AGGREGATE        |               |     1 |    13 
|   2 |   PX COORDINATOR       |               |       |       
|   3 |    PX SEND QC (RANDOM) | :TQ10000      |     1 |    13 
|   4 |     SORT AGGREGATE     |               |     1 |    13 
|   5 |      PX BLOCK ITERATOR |               |    19M|   236M
|   6 |       TABLE ACCESS FULL| XXXX_LOG      |    19M|   236M
---------------------------------------------------------------
但是发现执行计划并没有使用本地索引,而是继续全表扫描!难道ORACLE的OPTIMIZER坚持自己的意见?!
    接下来换用HINT提示使用主键:
SQL> SELECT /*+ index (XXX_LOG SYS_C0021352)*/ count(MESSAGE_ID) FROM XXX_LOG;

Execution Plan
----------------------------------------------------------
Plan hash value: 3940329838

-------------------------------------------------------------------------
| Id  | Operation        | Name         | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |              |     1 | 96181   (1)| 00:19:15 |
|   1 |  SORT AGGREGATE  |              |     1 |            |          |
|   2 |   INDEX FULL SCAN| SYS_C0021352 |    19M| 96181   (1)| 00:19:15 |
-------------------------------------------------------------------------
    发现计划正常使用了HINT提示的主键(SYS_C0021352)。

    结论:看来ORACLE的优化器不接受HINT使用本地索引的指示! -:)

---
   环境:
   ORACLE版本:10.2.0.1
   OS        :HP-UX B.11.23 U ia64

   显示的表名等信息因为涉及保密原因,做了一定的屏蔽。

   SQL的执行计划,因为显示的缘故做了一定的裁剪。

本文转自Be the miracle!博客51CTO博客,原文链接http://blog.51cto.com/miracle/52664如需转载请自行联系原作者


Larry.Yue