如何以较好的性能访问Oracle内核表?

    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)

更感兴趣是如何发现的?

:)

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • With pleasure.
  • 乐意帮忙.
  • Would you mind opening the window?
  • 你介意开窗吗?
  • Not at all.
  • 一点儿也不.
  • I wondered if you could buy me some pencils?
  • 我不知道你是否能替我买铅笔?
  • Sure.
  • 当然.