« 如何以较好的性能访问Oracle内核表? »
Oracle » http://www.anysql.net/oracle/oracle_kernel_table_index.html 2007-08-02Oracle通常在一些内核表的INDX列有特殊的索引, 如果能用到这些索引, 则访问很快, 否则在会话数很多的数据库上很慢. 最简单的访问就是用等于去访问.
SQL> SELECT INDX, KSLESWTS,KSLESTIM FROM X$KSLEI WHERE INDX=1;
INDX KSLESWTS KSLESTIM
———- ———- ———-
1 0 0Elapsed: 00:00:00.01
换成IN看看? 有点慢, 因为这时不能使用索引.
SQL> SELECT INDX, KSLESWTS,KSLESTIM FROM X$KSLEI WHERE INDX IN (100,200);
INDX KSLESWTS KSLESTIM
———- ———- ———-
100 0 0
200 6 57927Elapsed: 00:00:02.11
这么慢是不行的!, 加一个Hint试试吧.
SQL> SELECT /*+ USE_CONCAT */ INDX, KSLESWTS,KSLESTIM
2 FROM X$KSLEI WHERE INDX IN (100,200);INDX KSLESWTS KSLESTIM
———- ———- ———-
200 6 57927
100 0 0Elapsed: 00:00:00.03
一不小心加个-1, 结果很惨啊!
SQL> SELECT /*+ USE_CONCAT */ INDX, KSLESWTS,KSLESTIM
2 FROM X$KSLEI WHERE INDX IN (100,200,-1);INDX KSLESWTS KSLESTIM
———- ———- ———-
200 6 57927
100 0 0Elapsed: 00:00:02.12
后来给eagle_fan看了, 他建议试一下一个大的正数.
SQL> SELECT /*+ USE_CONCAT */ INDX, KSLESWTS,KSLESTIM
2 FROM X$KSLEI WHERE INDX IN (100,200,100000);INDX KSLESWTS KSLESTIM
———- ———- ———-
200 6 57927
100 0 0Elapsed: 00:00:00.02
和普通的索引不一样, 一般只能在等于情况下用到, 因为它不是一个真正存在的索引, 而是一种算法.


更感兴趣是如何发现的?
:)