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

Oracle SQL:子查询与Order By Fetch First 1 Row Only效率对比

两种Oracle SQL查询的执行效率对比

我们有一张超500万条数据的审计表(结构及样例数据如下),需求是获取REF_NO为'Dummy2'的记录中ID最大的那条的薪资(即Dummy2的最新薪资),以下是两种查询语句,我们来对比它们的执行效率:

IDREF_NONAMESALARY
1Dummy1Smith5487
2Dummy2Tim3123
3Dummy1Smith432424
4Dummy4Steve99577
5Dummy5Matt5551444
6Dummy2Tim432112
7Dummy7Brad89897
8Dummy3Kevin123213
9Dummy3Kevin7878
10Dummy3Kevin43555
11Dummy2Tim432
12Dummy8Jerry32123
13Dummy8Jerry43434
14Dummy9Gayle8989897
15Dummy2Tim1234
16Dummy6Jeff8989987
17Dummy1Smith545453
18Dummy2Tim6464
19Dummy2Tim43535
20Dummy1Smith64643
21Dummy8Jerry995

查询语句1

select a.Name,
       a.Salary
from   table a
where  a.REF_NO = 'Dummy2'
and    a.ID = (select max(id) from table where REF_NO = a.REF_NO)   

查询语句2

select Name,
       Salary
from   table
where  REF_NO = 'Dummy2'
order by ID desc
fetch first row only

执行效率对比

在Oracle中,查询语句2的执行效率更高,原因如下:

  • 查询逻辑层面:
    查询1是关联子查询,对于每个满足REF_NO='Dummy2'的记录,都会触发一次子查询获取该REF_NO对应的最大ID,即便Oracle有优化,500万级数据下重复执行子查询的开销也会很明显;而查询2先过滤出目标REF_NO的所有记录,再按ID降序取第一条,逻辑更简洁直接。
  • 索引利用层面:
    如果创建了复合索引(REF_NO, ID DESC, SALARY, NAME),查询2可以直接通过索引定位到符合条件的第一条记录,无需回表、无需额外排序(索引本身已按ID降序排列),一次索引扫描就能完成;查询1即便用同样索引,子查询虽能快速取到最大ID,但外层还要做ID匹配,步骤比查询2繁琐。
  • 执行计划角度:
    查询2的执行计划通常是「索引范围扫描(按REF_NO过滤)→ 直接取第一条记录」,ORDER BY会被索引优化掉;查询1的执行计划要么是外层扫描每条匹配记录触发子查询,要么是合并子查询后做关联判断,整体复杂度高于查询2。

总结:在大数量级数据场景下,查询2的执行效率明显优于查询1,尤其是有合适索引加持时,差距会更显著。

内容的提问来源于stack exchange,提问作者Intekhab Alam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:12:42