Oracle 11g中INTERSECT与EXISTS的性能对比:哪种查询更优?
Oracle 11g中INTERSECT vs EXISTS:哪种查询性能更优?
针对你给出的场景——Student_Status记录数远多于Student_Master,我来拆解下这两个查询的性能差异:
先看EXISTS查询
SELECT STUDENT_ID FROM Student_Master M WHERE EXISTS (SELECT STUDENT_ID FROM Student_Status S WHERE M.STUDENT_ID=S.STUDENT_ID)
这是一个相关子查询,执行逻辑相当高效:
- 外层先遍历数据量较小的
Student_Master(仅3条记录),每取出一条记录,就用它的STUDENT_ID去Student_Status里做匹配 - 只要在
Student_Status中找到匹配的STUDENT_ID,就会立刻停止当前子查询的执行(不需要扫完整张大表) - 如果
Student_Status的STUDENT_ID字段上建有索引,那每次匹配都是毫秒级的索引查找,开销极低
再看INTERSECT查询
SELECT STUDENT_ID FROM Student_Master INTERSECT SELECT STUDENT_ID FROM Student_Status
INTERSECT的执行逻辑开销就大很多了:
- 它会先分别执行两个SELECT语句,拿到两个完整的结果集
- 接着对这两个结果集分别做排序、去重操作(INTERSECT默认会自动去重)
- 最后再对比两个有序结果集,找出交集部分
- 由于
Student_Status数据量极大,第二个SELECT的结果集非常庞大,排序和去重的过程会消耗大量CPU和内存资源,性能开销远高于EXISTS
结论
在你这个场景下(小表驱动大表,且大表的关联字段建议建索引),EXISTS的性能会显著优于INTERSECT。
额外提一句:如果Student_Status的STUDENT_ID没有索引,两种查询的性能都会下降,但EXISTS依然会更靠谱——毕竟它只需要逐行匹配小表的记录,而INTERSECT还是要处理大结果集的排序去重操作。
内容的提问来源于stack exchange,提问作者Sarath Subramanian
相关产品推荐
相关产品推荐

