相交存在性能Oracle11g

Posted

技术标签:

【中文标题】相交存在性能Oracle11g【英文标题】:Intersect and exists performance Oracle11g 【发布时间】:2018-01-05 14:25:20 【问题描述】:

我想知道INTERSECTEXISTSOracle 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的主要内容,如果未能解决你的问题,请参考以下文章

如何从 11g Oracle (PL/SQL) 上的 URL 传递凭据和下载文件?

Oracle 11g 之自动收集统计信息

如何写sql语句恢复11g oracle数据库用户密码

Oracle 自动收集统计

Oracle之自动收集统计信息

Linux静默安装Oracle