最近在研究一个SQL的时候,发现一个有意思的问题。Sql代码如下:
sql代码挺长的,我们直接看它的执行计划,把它的执行计划在https://explain.depesz.com/格式化显示。
通过STATS可以发现,SQL总共执行3.2秒,Limit这个操作占用了近1.1秒的时间。这里首先我们对数据进行全部排序,排序完后选择整个记录的第一行。按道理来说慢应该在排序这个地方,而不应该在limit 1这里。
为了研究这个问题,搜索了一下,发现stackoverflow中有人提过这类问题。
我按照这个思路,把这个SQL进行了改写,使用了row_number() OVER()的方式。改写后代码如下:
经过改写后的执行计划如下:
查看统计值
几乎没有特别高消耗。执行时间从3.2秒下降到1.4秒。
当然此类问题还有很多,都是limit 1引起的。我在stackexchange上也发现了这样的一个案例。
我们观察它改写之前和改写之后的SQL,整个改写就是把它变成了子查询就正常了。这是因为前面的SQL没有使用上索引,改成子查询后就使用上了索引。
知乎上也有作者遇到这个问题,并按照这个方式解决了。https://zhuanlan.zhihu.com/p/45748671
所以说order by Limit n这种写法是有坑的。如果你发现它有一些慢,建议进行改写。

更多精彩干货分享
点击下方名片关注
IT那活儿

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
外国CTO也感兴趣的开源数据库项目——openHalo
小满未满、
354次阅读
2025-04-21 16:58:09
9.9 分高危漏洞,尽快升级到 pgAdmin 4 v9.2 进行修复
严少安
351次阅读
2025-04-11 10:43:23
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
329次阅读
2025-04-15 14:48:05
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
294次阅读
2025-04-07 12:14:29
postgresql+patroni+etcd高可用安装
necessary
166次阅读
2025-03-28 10:11:23
从 Oracle 到 PostgreSQL迁移成本评估揭秘
梧桐
151次阅读
2025-03-27 17:21:42
手把手教你在 openKylin 上部署 IvorySQL 4.4
严少安
150次阅读
2025-03-27 20:41:28
转发有奖 | PostgreSQL 16 PGCM高级认证课程直播班招生中!
墨天轮小教习
146次阅读
2025-04-14 15:58:34
墨天轮PostgreSQL认证证书快递已发(2025年3月批)
墨天轮小教习
126次阅读
2025-04-03 11:43:25
SQL 优化之 OR 子句改写
xiongcc
91次阅读
2025-04-21 00:08:06