相交存在性能Oracle11g
Posted
技术标签:
【中文标题】相交存在性能Oracle11g【英文标题】:Intersect and exists performance Oracle11g 【发布时间】:2018-01-05 14:25:20 【问题描述】:我想知道INTERSECT
或EXISTS
在Oracle 11g
中的性能是否更好。考虑一下我有以下两个表。
Student_Master
STUDENT_ID NAME
---------- ------
STUD01 ALEX
STUD02 JAMES
STUD03 HANS
学生状态
STUDENT_ID STATUS
---------- ------
STUD01 Fail
STUD02 Pass
STUD03 Pass
考虑到表 Student_Status 与表 Student_Master 相比,表的记录数更多,以下哪个查询会执行得更好。
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)
【问题讨论】:
您是否尝试比较解释计划? 要么更快,要么相同。 11g 的性能比什么好? 【参考方案1】:快速测试会建议 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 |
-------------------------------------------------------------------------------------
【讨论】:
谢谢 BobC。很好的答案【参考方案2】:带有 EXIST 运算符的第二种形式总是对 Student_Master 表进行全扫描,所以我认为,使用 intersect 会获得更好的性能。但是你需要在主表上使用索引。
更多关于 EXIST 的信息可以在这里找到:Ask TOM - IN & EXISTS
【讨论】:
以上是关于相交存在性能Oracle11g的主要内容,如果未能解决你的问题,请参考以下文章