学习oracle技术,每天学一点,每天进步一点

一个很简单的查询,为什么用不到索引

上一篇 / 下一篇  2008-04-02 10:39:07 / 个人分类:pl/sql

http://www.itpub.net/viewthread.php?tid=964719&extra=&page=1

create table test  as select rownum id,rownum-1 id2 from dba_objects;
NzmQ{&e0
?6w5e"}m ]WJV"dJ0create index idx_test1 on test(id2);
I.~)h!GI9w K0ITPUB个人空间5AP7~#z yek&Y:ENEM{
analyze table test compute statistics for all indexes;ITPUB个人空间v5a*{ h^ ]~._
ITPUB个人空间Wu'`W/C DIX7v
SQL> set autot on
U9m2Is!ck&a~&m!?[0SQL> select id  from testITPUB个人空间 j4mL b+R,e
  2  whereITPUB个人空间:f] ]7J@T&V
  3  id2 in
z/?:~M&{0  4     (ITPUB个人空间6eO0\(^BT$B&f:V7DN
  5    select  '2' from dual
S2j6M`&j-vo%h R9P%Cj0  6      );
`1m [i)o8q0ITPUB个人空间4wLp5opMyW vT
        ID
L5RNL5b["K8pr0----------ITPUB个人空间av~"q;p1J#z
         3
mo%Ci#mUg0ITPUB个人空间3R XC|0t;~\Drc%~
ITPUB个人空间!LrsBorOY"e
Execution PlanITPUB个人空间L*U+r]!i"T
----------------------------------------------------------ITPUB个人空间T0sD+ZY%Ld
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=30 Card=8168 Bytes=7
\A)`} p0          3512)
&\ Off1tQ w0
5hcP,n#uJ0   1    0   HASH JOIN (Cost=30 Card=8168 Bytes=73512)
'Q O`0RYC&?7B0   2    1     TABLE ACCESS (FULL) OF 'TEST' (Cost=3 Card=6173 Bytes=37ITPUB个人空间I s/`La%\E KL!Z^V
          038)
:Y)` GjT*V@0ITPUB个人空间1b a+Xl&}D+x
   3    1     VIEW OF 'VW_NSO_1' (Cost=24 Card=8168 Bytes=24504)ITPUB个人空间mz}r-D_ t
   4    3       SORT (UNIQUE) (Cost=24 Card=8168)
Mv{&ja@0   5    4         TABLE ACCESS (FULL) OF 'DUAL' (Cost=11 Card=8168)ITPUB个人空间(\ gTJ,f

?]xdvo6^ FH0
:t[B;[w0
SD c'R K0ITPUB个人空间&uS8t GFn{
StatisticsITPUB个人空间)er9Wm_Q;aF z
----------------------------------------------------------
6m cP\!m0          0  recursive calls
0u2F sK!S3BE]p6E"Kk0          0  db block gets
7K2Dr[Z5`I0ZQ0         19  consistent gets
9i-JCDSd;B*`YK0          0  physical reads
o#I [9h jk.xLE0          0  redo sizeITPUB个人空间7^~St `_a9b-U j
        373  bytes sent via SQL*Net to client
BeR+ZpU,?0        503  bytes received via SQL*Net from clientITPUB个人空间 B;x-j7f QY
          2  SQL*Net roundtrips to/from clientITPUB个人空间ecN[;_T2s.h
          1  sorts (memory)
6[a d0h*?0          0  sorts (disk)ITPUB个人空间AolM+K(}ZI#mb
          1  rows processed
-te&N'[!R0
.|[2g8hp9c*`0SQL> select id  from test
y \uvH0  2  whereITPUB个人空间'wr`7Pxq&M[
  3  id2 in
5W(b"sZ\0  4     (ITPUB个人空间&Q9PSY]e
  5     '2','3'
#Io-\ lwd0  6      );
.W uqE x0
N zg3s(r"MXX(F.W0        IDITPUB个人空间 d2A[(p`
----------
#a0q? X9oEO0         3ITPUB个人空间 pz^KcK2D#d
         4
1G8\X'^Kxe2P4`0ITPUB个人空间_Yb$Sb!a
ITPUB个人空间t8OdS(KzkUR$F0Z
Execution PlanITPUB个人空间6v#PtXi.@
----------------------------------------------------------
rv~+^,N!U Y0   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=3 Card=2 Bytes=12)
lj4aO0j0   1    0   INLIST ITERATORITPUB个人空间q)x6dK,Q3r {
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=3 Card=2 B
`o\zuw0          ytes=12)
c)EqJvD0ITPUB个人空间.vqE-a7U1i!@
   3    2       INDEX (RANGE SCAN) OF 'IDX_TEST1' (NON-UNIQUE) (Cost=2ITPUB个人空间u:k GkkW,v-I
           Card=2)ITPUB个人空间5};q:X5z_7k
ITPUB个人空间 sV)S5H`-Hq&t-Os/\
ITPUB个人空间[zKx-lZvn
ITPUB个人空间g2Qo;j8uG

;K6l%o4hK y6C}O*M0
f,g!|_*sqp3Y0StatisticsITPUB个人空间5\W$@qv
----------------------------------------------------------ITPUB个人空间 G X.gQ;uB8B
          0  recursive calls
['M'O1{|DEkG0          0  db block gets
|5~,pV8V-K0          7  consistent gets
TA [u)_$o0_x0          0  physical readsITPUB个人空间F`"B.I&]*d T J
          0  redo sizeITPUB个人空间7`Hl7?_E5h&r
        408  bytes sent via SQL*Net to clientITPUB个人空间1Vc*m j1a N
        503  bytes received via SQL*Net from client
J.QG Bhq/A)K)c0          2  SQL*Net roundtrips to/from clientITPUB个人空间#^6][O elTx:ar)U:@
          0  sorts (memory)ITPUB个人空间8kJKy(a,w|
          0  sorts (disk)
;s @;If*Sb*F @0          2  rows processed
nvc7gc0
!u vpj1]J1Oc0SQL>ITPUB个人空间"?1a.SJq9K{v-h
对dual表进行分析后

会用上索引

因为dual是系统表一分析可能会其他系统表用到,会有影响

想到方法是将dual表改为其他表

create table t (id number);

analyze table t compute statistics;

SQL> select   id   from testITPUB个人空间Q(M$F7`1p-g XDq
  2  whereITPUB个人空间JLtf%t4Ou
  3  id2 in
0y0]\$?&H9HK5i pA(H0  4     (
'Sb!l^7P[x0  5     select '2'  from t
!l.l L:~9O-b0  6      );

Execution Plan
8_'Z:Nj%oi3e:o9Tb:V0----------------------------------------------------------ITPUB个人空间frS8S3`.m;s
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=6 Card=1 Bytes=9)
r5~ X Vqy|0   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
4w2bZ3fb.E R4X0          es=6)

   2    1     NESTED LOOPS (Cost=6 Card=1 Bytes=9)
:uy_ oM P?0   3    2       VIEW OF 'VW_NSO_1' (Cost=4 Card=1 Bytes=3)
%@AP6[ny!O.@VBG0   4    3         SORT (UNIQUE) (Cost=4 Card=1)ITPUB个人空间?{/dPRT
   5    4           TABLE ACCESS (FULL) OF 'T' (Cost=2 Card=1)
pVI*@;f G?2^0   6    2       INDEX (RANGE SCAN) OF 'IDX_TEST1' (NON-UNIQUE) (Cost=1
n,^^~/|4C @0           Card=1)
,av*a"Ce:v ]{i{m0

也用上索引了

也可以用下面这种方法:

select id  from testITPUB个人空间5eJ)s0VQ&m$a
id2 inITPUB个人空间'I3N?K~/Qgh Aq&p
   (ITPUB个人空间$Zs#H!iz:x6D
   select '2'  from dual where rownum < 2
0v"V&^;zb G$N0    )ITPUB个人空间,L2ziC$s}3t x J#x
也会用上索引

楼主用的方法是把相关表统计资料删除掉,完全用RBO了


+wup M5t7|+ge5Y0 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-14  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 20466
  • 日志数: 291
  • 图片数: 2
  • 建立时间: 2007-12-11
  • 更新时间: 2008-10-04

RSS订阅

Open Toolbar