查看: 2245|回复: 6

SQL 优化

[复制链接]
论坛徽章:
0
发表于 2009-11-14 10:02 | 显示全部楼层 |阅读模式
新上系统出现这样一个超级SQL,大家给点儿优化的建议啊:


INSERT /*+append */
INTO DCUSER.TEMPTFX_KHH_ZCSZ
  (ID,
   KHH,
   YYB,
   TJRQ,
   ZJYE,
   ZJYE_RMB,
   ZJYE_HKD,
   ZJYE_USD,
   WJS_HGJE,
   WJSZJ_RMB,
   WJSZJ_HKD,
   WJSZJ_USD,
   GPSZ,
   GPSZ_RMB,
   GPSZ_HKD,
   GPSZ_USD,
   CCCB,
   CCCB_RMB,
   CCCB_HKD,
   CCCB_USD,
   GPSZ_A_SHAG,
   GPSZ_A_SZAG,
   GPSZ_A_TAAG,
   GPSZ_B_SHBG,
   GPSZ_B_SZBG,
   GPSZ_B_TUBG,
   GPSZ_QZ,
   GPSZ_J_TZJJ,
   GPSZ_J_LOF,
   GPSZ_J_ETF,
   GPSZ_Z_GZ,
   GPSZ_Z_QY,
   GPSZ_Z_ZZ,
   GPSZ_QT,
   JJJZ_HBJJ,
   JJJZ_FHBJJ,
   ZC,
   ZC_RMB,
   ZC_HKD,
   ZC_USD)
  SELECT A.ID,
         A.KHH,
         A.YYB,
         :B1 AS TJRQ,
         SUM(CASE
               WHEN B.TYPE = 2 THEN
                B.ZBZ * B.DHBL
               ELSE
                0
             END) ZJYE,
         SUM(CASE
               WHEN B.TYPE = 2 AND B.BZ = 1 THEN
                B.ZBZ * B.DHBL
               ELSE
                0
             END) ZJYE_RMB,
         SUM(CASE
               WHEN B.TYPE = 2 AND B.BZ = 2 THEN
                B.ZBZ * B.DHBL
               ELSE
                0
             END) ZJYE_HKD,
         SUM(CASE
               WHEN B.TYPE = 2 AND B.BZ = 3 THEN
                B.ZBZ * B.DHBL
               ELSE
                0
             END) ZJYE_USD,
         0 WJS_HGJE,
         SUM(CASE
               WHEN B.TYPE = 2 AND B.BZ = 1 THEN
                B.WJSZJ
               ELSE
                0
             END) WJSZJ_RMB,
         SUM(CASE
               WHEN B.TYPE = 2 AND B.BZ = 2 THEN
                B.WJSZJ
               ELSE
                0
             END) WJSZJ_HKD,
         SUM(CASE
               WHEN B.TYPE = 2 AND B.BZ = 3 THEN
                B.WJSZJ
               ELSE
                0
             END) WJSZJ_USD,
         SUM(CASE
               WHEN B.TYPE = 1 THEN
                B.ZBZ * B.DHBL
               ELSE
                0
             END) GPSZ,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.BZ = 1 THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_RMB,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.BZ = 2 THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_HKD,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.BZ = 3 THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_USD,
         SUM(CASE
               WHEN B.TYPE = 1 THEN
                B.CCCB * B.DHBL
               ELSE
                0
             END) CCCB,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.BZ = 1 THEN
                B.CCCB
               ELSE
                0
             END) CCCB_RMB,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.BZ = 2 THEN
                B.CCCB
               ELSE
                0
             END) CCCB_HKD,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.BZ = 3 THEN
                B.CCCB
               ELSE
                0
             END) CCCB_USD,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.TJFL = 1 AND B.JYS = '2' THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_A_SHAG,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.TJFL = 1 AND B.JYS = '1' THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_A_SZAG,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.TJFL = 1 AND B.JYS = '5' THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_A_TAAG,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.TJFL = 6 AND B.JYS = '4' THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_B_SHBG,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.TJFL = 6 AND B.JYS = '3' THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_B_SZBG,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.TJFL = 6 AND B.JYS = '5' THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_B_TUBG,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.TJFL = 2 THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_QZ,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.ZQLB = 30 THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_J_TZJJ,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.ZQLB = 31 THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_J_LOF,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.ZQLB = 36 THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_J_ETF,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.ZQLB = 40 THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_Z_GZ,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.ZQLB = 41 THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_Z_QY,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.ZQLB = 42 THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_Z_ZZ,
         SUM(CASE
               WHEN B.TYPE = 1 AND B.TJFL NOT IN (1, 2, 3, 4, 5, 6, 8, 9) THEN
                B.ZBZ
               ELSE
                0
             END) GPSZ_QT,
         SUM(CASE
               WHEN B.TYPE = 3 AND B.ZQLB = 83 THEN
                B.ZBZ
               ELSE
                0
             END) JJJZ_HBJJ,
         SUM(CASE
               WHEN B.TYPE = 3 AND B.ZQLB != 83 THEN
                B.ZBZ
               ELSE
                0
             END) JJJZ_FHBJJ,
         SUM(NVL((B.ZBZ + B.WJSZJ) * B.DHBL, 0)) ZC,
         SUM(CASE
               WHEN B.BZ = 1 THEN
                B.ZBZ + B.WJSZJ
               ELSE
                0
             END) ZC_RMB,
         SUM(CASE
               WHEN B.BZ = 2 THEN
                B.ZBZ + B.WJSZJ
               ELSE
                0
             END) ZC_HKD,
         SUM(CASE
               WHEN B.BZ = 3 THEN
                B.ZBZ + B.WJSZJ
               ELSE
                0
             END) ZC_USD
    FROM CRMII.TKHXX A
    LEFT JOIN (SELECT KHH,
                      1 TYPE,
                      N.BZ,
                      T.TJFL TJFL,
                      T.ZQLB,
                      FZ3 JYS,
                      ZBZ * SZXS ZBZ,
                      0 WJSZJ,
                      BY2 * SZXS CCCB,
                      DHBL
                 FROM DCUSER.TZB_R_KH_2102 B, CRMII.TZQLB T, CRMII.THLCS N
                WHERE B.FZ1 = TO_CHAR(N.BZ)
                  AND B.FZ2 = T.ZQLB
                  AND KSRQ <= :B1
                  AND JSRQ >= :B1
               UNION ALL
               SELECT KHH,
                      2 TYPE,
                      N.BZ,
                      0 TJFL,
                      0 ZQLB,
                      ' ' JYS,
                      ZBZ,
                      BY1 WJSZJ,
                      0.0 CCCB,
                      DHBL
                 FROM DCUSER.TZB_R_KH_2101 B, CRMII.THLCS N
                WHERE B.FZ1 = TO_CHAR(N.BZ)
                  AND KSRQ <= :B1
                  AND JSRQ >= :B1
               UNION ALL
               SELECT KHH,
                      3 TYPE,
                      1 BZ,
                      T.TJFL TJFL,
                      T.ZQLB,
                      FZ3 JYS,
                      ZBZ * SZXS ZBZ,
                      0 WJSZJ,
                      BY2 * SZXS CCCB,
                      1 DHBL
                 FROM DCUSER.TZB_R_KH_2104 B, CRMII.TZQLB T
                WHERE B.FZ2 = T.ZQLB
                  AND KSRQ <= :B1
                  AND JSRQ >= :B1) B
      ON A.KHH = B.KHH
   WHERE (A.KHZT <> 3 OR (A.KHZT = 3 AND A.XHRQ >= :B1))
     AND A.KHRQ <= :B1
   GROUP BY A.ID, A.KHH, A.YYB
论坛徽章:
3
参与WIN7挑战赛纪念
日期:2009-11-09 11:55:23生肖徽章2007版:龙
日期:2009-11-16 18:41:542012新春纪念徽章
日期:2012-01-04 11:53:54
发表于 2009-11-14 10:14 | 显示全部楼层

回复 #1 blakema 的帖子

能把你的执行计划发上来吗?

使用道具 举报

回复
招聘 : 数据库管理员
认证徽章
论坛徽章:
20
祖国60周年纪念徽章
日期:2009-10-09 08:28:00数据库板块每日发贴之星
日期:2011-02-20 01:01:01ITPUB季度 技术新星
日期:2011-04-02 10:31:09ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:192013年新春福章
日期:2013-02-25 14:51:242011新春纪念徽章
日期:2011-02-18 11:43:33
发表于 2009-11-14 10:39 | 显示全部楼层
我汗。。。。    看看执行计划再说呗

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2009-11-14 10:41 | 显示全部楼层

计划

计划.PNG

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2009-11-14 10:43 | 显示全部楼层
1.收集统计信息
2.去掉绑定变量,这样的查询还用绑定变量有啥意义

使用道具 举报

回复
论坛徽章:
55
马上加薪
日期:2014-02-19 11:55:142010广州亚运会纪念徽章:排球
日期:2011-04-27 13:27:19SQL大赛参与纪念
日期:2011-04-13 12:08:172011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:01生肖徽章2007版:兔
日期:2011-01-20 12:58:49
发表于 2009-11-14 11:43 | 显示全部楼层
能不能先把union all 部分先插入到临时表。然后在关联。

使用道具 举报

回复
论坛徽章:
55
马上加薪
日期:2014-02-19 11:55:142010广州亚运会纪念徽章:排球
日期:2011-04-27 13:27:19SQL大赛参与纪念
日期:2011-04-13 12:08:172011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:01生肖徽章2007版:兔
日期:2011-01-20 12:58:49
发表于 2009-11-14 13:00 | 显示全部楼层
象楼主这样的sql.我不明白为什么当吧union all 写入单独一张表,最后在关联查询的时候。效率要比直接关联要来的快很多。

难道真是影响了执行计划。不得而只

[ 本帖最后由 xsmdel 于 2009-11-14 13:38 编辑 ]

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表