簡體   English   中英

相交並存在性能Oracle11g

[英]Intersect and exists performance Oracle11g

我想知道INTERSECTEXISTSOracle 11g是否具有更好的性能。 考慮一下我有以下兩個表。

Student_Master

STUDENT_ID   NAME
----------  ------
STUD01       ALEX
STUD02       JAMES
STUD03       HANS

Student_Status

STUDENT_ID   STATUS
----------  ------
STUD01       Fail
STUD02       Pass
STUD03       Pass

考慮到與表Student_Master相比,表Student_Status的記錄數更多,以下哪個查詢的性能更好。

SELECT STUDENT_ID FROM Student_Master
INTERSECT
SELECT STUDENT_ID FROM Student_Status

SELECT STUDENT_ID FROM Student_Master M
WHERE EXISTS
(SELECT STUDENT_ID FROM Student_Status S WHERE M.STUDENT_ID=S.STUDENT_ID)

快速測試將建議使用EXISTS選項...

SELECT STUDENT_ID FROM Student_Master INTERSECT SELECT STUDENT_ID FROM
Student_Status

Plan hash value: 416197223

--------------------------------------------------------------------------------------
| Id  | Operation             | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                    |       |       |     6 (100)|          |
|   1 |  INTERSECTION         |                  |       |       |              |            |
|   2 |   SORT UNIQUE         |                  |     3 |    36 |     3  (34)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| STUDENT_MASTER |     3 |    36 |     2   (0)| 00:00:01 |
|   4 |   SORT UNIQUE         |                  |     3 |    36 |     3  (34)| 00:00:01 |
|   5 |    TABLE ACCESS FULL| STUDENT_STATUS |     3 |    36 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

-

SELECT STUDENT_ID FROM Student_Master M WHERE EXISTS (SELECT STUDENT_ID
FROM Student_Status S WHERE M.STUDENT_ID=S.STUDENT_ID)

Plan hash value: 361045672

-------------------------------------------------------------------------------------
| Id  | Operation      | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |            |       |       |     4 (100)|      |
|*  1 |  HASH JOIN SEMI    |            |     3 |    72 |     4   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| STUDENT_MASTER |     3 |    36 |     2   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| STUDENT_STATUS |     3 |    36 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

使用EXIST運算符的第二種形式始終對Student_Master表進行完全掃描,因此,我認為,使用相交將獲得更好的性能。 但是您需要在主表上使用索引。

可以在這里找到有關EXIST的更多信息: Ask TOM-IN&EXISTS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM