使用开窗函数优化查询的一个案例
早上检查报警邮件时发现又是1000+的报警,于是查找凶手...
最终找到了罪魁祸首,一个ETL查询从晚上10点开始跑到凌晨1点50,好家伙足足跑了3小时50分钟,阻塞了一片一片的JOB:
SELECT **** FROM A INNER JOIN ( SELECT XXX,A.END_DATE_REP,MAX(PUBLISH_DATE) AS PUBLISH_DATE FROM A INNER JOIN ( SELECT XXX,MAX(END_DATE_REP) AS END_DATE_REP FROM A GROUP BY XXX )B ON A.XXX = B.XXX AND A.END_DATE_REP=B.END_DATE_REP GROUP BY A.XXX,A.END_DATE_REP ) C ON A.XXX = C.XXX AND A.END_DATE_REP=C.END_DATE_REP AND A.PUBLISH_DATE=C.PUBLISH_DATE LEFT JOIN (SELECT A.* FROM B JOIN ( SELECT XXX,FISCAL_PERIOD,MAX(PUBLISH_DATE) AS PUBLISH_DATE FROM B GROUP BY XXX,FISCAL_PERIOD ) D ON B.XXX = D.XXX AND B.PUBLISH_DATE = D.PUBLISH_DATE ) F ON A.XXX = F.XXX AND A.END_DATE_REP = F.END_DATE_REP
一看到这个查询,瞬间被石化了。典型的使用开窗函数的场景嘛。尝试使用如下的开窗函数写法后,妥妥的10s内解决战斗。
SELECT **** FROM ( SELECT XXX,RANK() OVER (PARTITION BY XXX ORDER BY END_DATE_REP DESC,PUBLISH_DATE DESC) RAK FROM A WITH(NOLOCK) ) C LEFT JOIN ( SELECT XXX,END_DATE_REP,RANK() OVER (PARTITION BY XXX,END_DATE_REP ORDER BY PUBLISH_DATE DESC) RAK FROM B WITH(NOLOCK) ) F ON C.XXX=F.XXX AND C.END_DATE_REP = F.END_DATE_REP AND F.RAK = 1 WHERE C.RAK = 1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南