使用开窗函数优化查询的一个案例
2015-08-19 17:21
459 查看
早上检查报警邮件时发现又是1000+的报警,于是查找凶手...
最终找到了罪魁祸首,一个ETL查询从晚上10点开始跑到凌晨1点50,好家伙足足跑了3小时50分钟,阻塞了一片一片的JOB:
一看到这个查询,瞬间被石化了。典型的使用开窗函数的场景嘛。尝试使用如下的开窗函数写法后,妥妥的10s内解决战斗。
最终找到了罪魁祸首,一个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
相关文章推荐
- 穿越明朝之富豪杨
- 编写高质量代码改善C#程序的157个建议——建议82:Parallel简化但不等同于Task默认行为
- POJ 2342
- linux系统环境下,对文件进行加密
- 怎么阅读论文,写心得体会
- cordova5.0 android程序访问外网报404错误解决办法
- java异常处理
- 开始学习ble,非常激动!
- fork函数详解
- NSIS 检测.NET Framework版本(学习九)
- cocos lua绑定感悟---tolua_isusertable及lua如何访问cocos静态函数的方法
- Android ViewGroup 中 mFocused 字段引起的问题
- 多线程之四:NSOperation与NSOperationQueue
- Redis Java连接操作
- 查询避免Unknown column ‘xxx’ in ‘where clause’
- 用smack+openfire做即时通讯
- C#获取当前路径方法整理
- android:layout_gravity 和 android:gravity 的区别
- asp网页无法打开
- 杨二哥扛把子