You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:14:20