Oracle的Order By结合ROWNUM查询写法效率问题

发布于 2022-09-02 08:58:32 字数 1019 浏览 20 评论 0

C4_CTI_CDR表是一个几百万数据的大表,cdr_id是主键自增序列,call_time是时间字段。

需求是按call_time倒序取出最近100条记录。

收集了两种不同写法,返回的结果都是一样的。

1、貌似是比较大众的写法

select * from (
    select t.* from C4_CTI_CDR t order by call_time desc 
) where rownum <= 100;

Navicat的查询编辑器里“解释”分析如下:

写法一分析

2、在某个网站上找到的写法

select * from C4_CTI_CDR where cdr_id in (
    select cdr_id from (
        select cdr_id from c4_cti_cdr order by call_time desc
    ) where rownum <= 100
)

Navicat查询编辑器“解释”如下:

写法二分析

哪种写法查询效率比较高?Navicat的解释我看不太懂,只是觉得好像第一种的层级少一些,而第二种写法的总Bytes(传输字节数?)少一些。

望大家不吝赐教,谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

︶ ̄淡然 2022-09-09 08:58:32

第二种写法更好,原因:
从需求分析,结果只需要100条数据,写法1将所有数据的所有列都取出,然后筛选了前100条,写法2讲所有数据的cdr_id取出,筛选了前100条,然后通过主键检索所有字段(走了一个100次的NESTED LOOPS),所以总bytes数写法2较少

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文