Oracle通常在一些内核表的INDX列有特殊的索引, 如果能用到这些索引, 则访问很快, 否则在会话数很多的数据库上很慢. 最简单的访问就是用等于去访问.
SQL> SELECT INDX, KSLESWTS,KSLESTIM FROM X$KSLEI WHERE INDX=1;
INDX KSLESWTS KSLESTIM
---------- ---------- ----------
1 0 0
Elapsed: 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 57927
Elapsed: 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 0
Elapsed: 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 0
Elapsed: 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 0
Elapsed: 00:00:00.02
和普通的索引不一样, 一般只能在等于情况下用到, 因为它不是一个真正存在的索引, 而是一种算法.
留言 (1)
更感兴趣是如何发现的?
:)
Posted by Fenng | Aug 2, 2007 1:57 PM