利用执行计划来避免排序操作(二)
上一篇 / 下一篇 2006-12-21 00:00:00 / 个人分类:ORACLE
很多执行计划本身就是需要排序的,通过特定的执行计划可以避免排序的产生。前两天在论坛中看到类似的问题。这里简单总结一下。
利用执行计划来避免排序操作(一):http://yangtingkun.itpub.net/post/468/242836
:^"e/g.|c.C`O0
上面讨论了单表查询如何利用执行计划来避免排序,这篇文章简单一下包含连接的查询如何通过执行计划来避免排序。
MERGE JOIN连接方式由于是先排序后连接,因此查询的结果本是就是包含排序的。
SQL> CREATE TABLE T1 (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30) NOT NULL);
表已创建。
SQL> CREATE TABLE T2 (ID NUMBER, NAME VARCHAR2(30));
表已创建。
SQL> CREATE INDEX IND_T1_NAME ON T1(NAME);
索引已创建。
SQL> INSERT INTO T1 SELECT ROWNUM, TABLE_NAME FROM USER_TABLES;
已创建17行。
SQL> INSERT INTO T2 SELECT ROWNUM, OBJECT_NAME FROM USER_OBJECTS;
已创建97行。
SQL> COMMIT;
提交完成。
SQL> SET AUTOT ON EXP
4J)F8VZt{0SQL> SELECT /*+ USE_MERGE(T1, T2) */ T2.NAME, T1.IDITPUB个人空间(Z6e"{oG3n
2 FROM T1, T2ITPUB个人空间SMB)?)g2Am5AI
3 WHERE T1.NAME = T2.NAME
)FJKxsI0 4 ;
NAME ID
T,Z2Gg-Z6kcDN0------------------------------ ----------
$U D8h%E)ObeWC[0BONUS 5ITPUB个人空间^:|@*Z9?!n%r+e
CHAINED_ROWS 2ITPUB个人空间m#]3R
t#h)PJ ucD
DEPT 3
d+o%j.Xr0DR$IND_T_DOCS$I 1
l0g,sn7Sg@r7^V0DR$IND_T_DOCS$K 17
;D6bY*oWi3f9d0DR$IND_T_DOCS$N 16
r KLr@0O0DR$IND_T_DOCS$R 9ITPUB个人空间$W4WnH6]dR@'a
DUMMY 7ITPUB个人空间(px!b8xz#{
EMP 4ITPUB个人空间!\,n0Ql:vE
SALGRADE 6ITPUB个人空间0C@I5wQ%f.|
T 8ITPUB个人空间n
^ZF1f%JQS
T1 14
)iIzy9` D:rU0T2 15ITPUB个人空间8}(KeU?,R8~R
T_BITMAP 13
7\'otp;Jm0T_DUMP 12
E mg9GA&OE0T_NOSORT 10
%@*k,BDM[0T_OTHER 11
已选择17行。
执行计划
m6V8q9b&_0----------------------------------------------------
x2~x
l
h ]0Plan hash value: 412793182
----------------------------------------------------
NBv%XhhAh0| Id | Operation | Name | Rows | Bytes |
'^'ksOT!}E0----------------------------------------------------
]]%]p!A4tIU*J5`0| 0 | SELECT STATEMENT | | 19 | 893 |ITPUB个人空间fZyGS ouY
| 1 | MERGE JOIN | | 19 | 893 |
9A4X HoD0| 2 | SORT JOIN | | 17 | 510 |ITPUB个人空间2qwvh"TaCg2cH([:g7]
| 3 | TABLE ACCESS FULL| T1 | 17 | 510 |
H&]'Y vj)UH)DR0|* 4 | SORT JOIN | | 97 | 1649 |
#z}$eH3c0| 5 | TABLE ACCESS FULL| T2 | 97 | 1649 |
'|bfxZS7i~9Y6o0----------------------------------------------------
Predicate Information (identified by operation id):ITPUB个人空间[{T&_4dW:yP
\c
---------------------------------------------------
4 - access("T1"."NAME"="T2"."NAME")ITPUB个人空间,[TN9{,M6him6~
filter("T1"."NAME"="T2"."NAME")
因此,如果指定排序为连接列的升序排列,使用MERGE JOIN可以避免排序的产生。
SQL> SELECT /*+ USE_MERGE(T2, T1) */ T2.NAME, T1.IDITPUB个人空间2N!|2v(b3Z.| ],Z
2 FROM T1, T2
Du(a)ci9Z%l0 3 WHERE T1.NAME = T2.NAMEITPUB个人空间([?v%o6@&K
4 ORDER BY T2.NAME
D7f y3s.I#p.AX8X
m0 5 ;
NAME IDITPUB个人空间Z
Oy?eX%I1W'X8m
------------------------------ ----------
Ob3e hA`0BONUS 5ITPUB个人空间(A2u[y5gG
CHAINED_ROWS 2ITPUB个人空间Pqyw*o&Xh4B
DEPT 3
/~4o"l&HC!SaIGo y0DR$IND_T_DOCS$I 1
q!BbIR @3my`0DR$IND_T_DOCS$K 17ITPUB个人空间g"y[6x6fh
DR$IND_T_DOCS$N 16
4M"[5@5La0DR$IND_T_DOCS$R 9ITPUB个人空间Q3N+r1t|\q%Gz
DUMMY 7ITPUB个人空间Q
K+LE7V*P%p
EMP 4ITPUB个人空间,h&Z$v;e[h
SALGRADE 6ITPUB个人空间B;[mXQp+f/T6k0M
T 8ITPUB个人空间.Eb#Uw3vamJ
T1 14
J$Y:|)e$p"^6nkZ0T2 15
/H)D#s
KC0l0T_BITMAP 13
m/|!W.oG8M&R0T_DUMP 12ITPUB个人空间S(h6cU#Kx$@1B
T_NOSORT 10
9rw@n)ta9it,J0T_OTHER 11
已选择17行。
执行计划ITPUB个人空间9Wx4bpE!s8E~9`
----------------------------------------------------
#]Z5s1YB
h7Qr0Plan hash value: 412793182
----------------------------------------------------ITPUB个人空间2`wNWq
| Id | Operation | Name | Rows | Bytes |ITPUB个人空间+G0[4I&G