亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

優化有標量子查詢的SQL

2024-07-21 02:46:36
字體:
來源:轉載
供稿:網友
優化有標量子查詢的SQL

數據庫環境:SQL SERVER 2008R2

今天在數據庫中抓出一條比較耗費資源的SQL,只返回904條數據,居然跑了40多分鐘。SQL及對應的數據量如下圖:

SELECT  saft04.cur_year ,        LEFT(saft04.dept_id, 4) sdept_id ,        saft04.vdept_id ,        saft04.dept_id ,        saft04.fee_id ,        saft04.vitem_id ,        ISNULL(saft04.fee_amt, 0) AS saft04_fee_amt ,        ISNULL(saft04.fee_qty, 0) AS saft04_fee_qty ,        ISNULL(saft04.fee_amt_flex, 0) AS saft04_fee_amt_flex ,        ISNULL(saft04.adj_amt, 0) AS saft04_adj_amt ,        ISNULL(saft04.init_amt, 0) AS saft04_init_amt ,        ISNULL(saft04.flex_amt, 0) AS saft04_flex_amt ,        ISNULL(saft04.conf_fee_amt, 0) AS saft04_conf_fee_amt ,        saft04.fc_app_no ,        saft04.zone_id ,        saft04.corr_id ,        CASE WHEN saft04.fc_app_no < '2010'             THEN ( CASE WHEN saft04.flexfapp_flag = 'Y'                         THEN ISNULL(fee_amt, 0) + ISNULL(adj_amt, 0)                              - ISNULL(conf_fee_amt, 0)                         ELSE ISNULL(init_amt, 0) + ISNULL(flex_amt, 0)                              + ISNULL(adj_amt, 0) - ISNULL(conf_fee_amt, 0)                    END )             ELSE CASE WHEN b.fee_type2 = '01'                            OR b.fee_type2 = '02'                       THEN ISNULL(fee_amt, 0) + ISNULL(adj_amt, 0)                            - ISNULL(conf_fee_amt, 0)                       WHEN b.fee_type2 = '03'                       THEN ISNULL(init_amt, 0) + ISNULL(flex_amt, 0)                            + ISNULL(adj_amt, 0) - ISNULL(conf_fee_amt, 0)                  END        END bal_amt ,        ISNULL(( SELECT SUM(b.oPR_amt)                 FROM   v_saft04_fexp b                 WHERE  b.fcapp_id = saft04.fc_app_no               ), 0) AS qty1 ,        CASE WHEN b.fee_type2 = '01'                  OR b.fee_type2 = '03'             THEN ISNULL(saft04.conf_fee_amt, 0)                  - ( ISNULL(( SELECT   SUM(b.opr_amt)                               FROM     v_saft04_fexp b                               WHERE    b.fcapp_id = saft04.fc_app_no                             ), 0) )             WHEN b.fee_type2 = '02'             THEN ISNULL(saft04.init_amt, 0) + ISNULL(saft04.flex_amt, 0)                  - ISNULL(( SELECT SUM(b.opr_amt)                             FROM   v_saft04_fexp b                             WHERE  b.fcapp_id = saft04.fc_app_no                           ), 0)                  + ISNULL(( SELECT SUM(d.opr_amt)                             FROM   v_fadj_rd d                             WHERE  d.fcapp_id = saft04.fc_app_no                           ), 0)        END qty2 ,        c.base_data2FROM    saft04        LEFT JOIN v_ctlm60 b ON b.fee_id = saft04.fee_id        LEFT JOIN ctlm1000 c ON c.d_type = 'fee_type2'                                AND b.fee_type2 = c.base_data1WHERE   1 = 1        AND saft04.com_id = 'LQPJ'        AND saft04.cur_year = 2015        AND saft04.dept_id LIKE '2001%'        AND ( saft04.dept_id IN ( SELECT    dept_id                                  FROM      ctlm2000                                  WHERE     user_id1 = '0100030' )              OR '0100030' = 'MANAGER'            )ORDER BY saft04.cur_year ,        saft04.vdept_id ,        saft04.dept_id ,        saft04.fee_id ,        saft04.vitem_id ,        saft04.zone_id ,        saft04.corr_id ,        saft04.fc_app_no-------------------------數據量統計----------------------------------SELECT COUNT(*)FROM saft04WHERE 1 = 1 AND saft04.com_id = 'LQPJ' AND saft04.cur_year = 2015 AND saft04.dept_id LIKE '%2001%' AND ( saft04.dept_id IN ( SELECT dept_id FROM ctlm2000 WHERE user_id1 = '0100030' ) OR '0100030' = 'MANAGER' )--904SELECT COUNT(*) FROM v_saft04_fexp --1262584SELECT COUNT(*) FROM v_fadj_rd d --37077SELECT COUNT(*) FROM v_ctlm60 --431SELECT COUNT(*) FROM ctlm1000 --377

看了一下SQL,有可能出現問題的地方有2個地方,第一個是saft04 表的過濾條件“saft04.dept_id LIKE '%2001%'”使用了模糊查詢,導致

走不了既定的索引。經和業務員確定,最開始只是想查詢以“2001”開頭的單位,因此,這個條件改成“saft04.dept_id LIKE '2001%'”即可。

第二個問題,是最要命的,標量部分“SELECT SUM(b.opr_amt) FROM v_saft04_fexp b WHERE b.fcapp_id = saft04.fc_app_no”走

的執行計劃是嵌套循環,因而要改成左聯接。

改寫后的SQL如下,只執行了23S就全部出結果了。

WITH    x0          AS ( SELECT   b.fcapp_id ,                        SUM(b.opr_amt) opr_amt               FROM     v_saft04_fexp b               GROUP BY b.fcapp_id             )    SELECT  saft04.cur_year ,            LEFT(saft04.dept_id, 4) sdept_id ,            saft04.vdept_id ,            saft04.dept_id ,            saft04.fee_id ,            saft04.vitem_id ,            ISNULL(saft04.fee_amt, 0) AS saft04_fee_amt ,            ISNULL(saft04.fee_qty, 0) AS saft04_fee_qty ,            ISNULL(saft04.fee_amt_flex, 0) AS saft04_fee_amt_flex ,            ISNULL(saft04.adj_amt, 0) AS saft04_adj_amt ,            ISNULL(saft04.init_amt, 0) AS saft04_init_amt ,            ISNULL(saft04.flex_amt, 0) AS saft04_flex_amt ,            ISNULL(saft04.conf_fee_amt, 0) AS saft04_conf_fee_amt ,            saft04.fc_app_no ,            saft04.zone_id ,            saft04.corr_id ,            CASE WHEN saft04.fc_app_no < '2010'                 THEN ( CASE WHEN saft04.flexfapp_flag = 'Y'                             THEN ISNULL(fee_amt, 0) + ISNULL(adj_amt, 0)                                  - ISNULL(conf_fee_amt, 0)                             ELSE ISNULL(init_amt, 0) + ISNULL(flex_amt, 0)                                  + ISNULL(adj_amt, 0) - ISNULL(conf_fee_amt,                                                              0)                        END )                 ELSE CASE WHEN b.fee_type2 = '01'                                OR b.fee_type2 = '02'                           THEN ISNULL(fee_amt, 0) + ISNULL(adj_amt, 0)                                - ISNULL(conf_fee_amt, 0)                           WHEN b.fee_type2 = '03'                           THEN ISNULL(init_amt, 0) + ISNULL(flex_amt, 0)                                + ISNULL(adj_amt, 0) - ISNULL(conf_fee_amt, 0)                      END            END bal_amt ,            ISNULL(( x0.opr_amt ), 0) AS qty1 ,            CASE WHEN b.fee_type2 = '01'                      OR b.fee_type2 = '03'                 THEN ISNULL(saft04.conf_fee_amt, 0) - ( ISNULL(( x0.opr_amt ),                                                              0) )                 WHEN b.fee_type2 = '02'                 THEN ISNULL(saft04.init_amt, 0) + ISNULL(saft04.flex_amt, 0)                      - ISNULL(( x0.opr_amt ), 0)                      + ISNULL(( SELECT SUM(d.opr_amt)                                 FROM   v_fadj_rd d                                 WHERE  d.fcapp_id = saft04.fc_app_no                               ), 0)            END qty2 ,            c.base_data2    FROM    saft04            LEFT JOIN v_ctlm60 b ON b.fee_id = saft04.fee_id            LEFT JOIN ctlm1000 c ON c.d_type = 'fee_type2'                                    AND b.fee_type2 = c.base_data1            LEFT JOIN x0 ON x0.fcapp_id = saft04.fc_app_no    WHERE   1 = 1            AND saft04.com_id = 'LQPJ'            AND saft04.cur_year = 2015            AND saft04.dept_id LIKE '2001%'            AND saft04.dept_id IN ( SELECT  dept_id                                    FROM    ctlm2000                                    WHERE   user_id1 = '0100030' )    ORDER BY saft04.cur_year ,            saft04.vdept_id ,            saft04.dept_id ,            saft04.fee_id ,            saft04.vitem_id ,            saft04.zone_id ,            saft04.corr_id ,            saft04.fc_app_no

改寫后的SQL還有一個標量子查詢沒處理,改寫的思路和上面一樣,因執行時間已經縮短到23S,就不改了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品综合精品自拍| www.日韩免费| 福利精品视频在线| 亚洲第一页在线| 日韩中文字幕第一页| 国产欧美日韩精品专区| 欧美日韩国产成人高清视频| 一区二区三区国产在线观看| 亚洲va欧美va国产综合久久| 欧美精品激情在线| 国产精品美女av| 国产在线精品一区免费香蕉| 国产精品激情av在线播放| 亚洲第一综合天堂另类专| 精品少妇一区二区30p| 国产精品亚洲自拍| 九九热99久久久国产盗摄| 亚洲人成伊人成综合网久久久| 国产精品99久久久久久www| 久久6精品影院| 尤物yw午夜国产精品视频明星| 68精品国产免费久久久久久婷婷| 欧美亚洲在线播放| 欧美一区二区视频97| 久久成人av网站| 亚洲黄色成人网| 欧美专区中文字幕| 亚洲男人av在线| 精品无人区乱码1区2区3区在线| 国内精品伊人久久| 中文字幕免费国产精品| 97视频在线观看免费| 欧美超级乱淫片喷水| 日韩中文在线视频| 国产精品久久久久不卡| 日韩天堂在线视频| 社区色欧美激情 | 日韩精品视频中文在线观看| 97久久国产精品| 日韩视频免费看| 色久欧美在线视频观看| 亚洲视频999| 欧美成人免费播放| 亚洲国产精品女人久久久| 亚洲欧美制服第一页| 久久久久久久一区二区| 久久久国产成人精品| 日韩av一区二区在线| 92版电视剧仙鹤神针在线观看| 亚洲午夜精品久久久久久性色| 亚洲国产日韩一区| 欧美有码在线观看视频| 91av在线免费观看视频| 欧美在线免费视频| 亚洲国产中文字幕在线观看| 国产亚洲精品久久久久久| 欧美在线亚洲在线| 国产精品丝袜久久久久久高清| 欧美最猛性xxxxx(亚洲精品)| 美女撒尿一区二区三区| 亚洲影视九九影院在线观看| 亚洲毛片在线观看.| 午夜精品一区二区三区av| 久久69精品久久久久久国产越南| 日韩小视频在线| 欧美一区二区影院| 亚洲人免费视频| 亚洲欧美福利视频| 亚洲a级在线观看| 国产精品久久久亚洲| 日韩中文字幕免费| 欧美午夜精品久久久久久人妖| 日本国产精品视频| 韩国三级电影久久久久久| 97精品欧美一区二区三区| 国产精品99久久久久久久久久久久| 欧美一级黑人aaaaaaa做受| 日韩精品一二三四区| 国产精品成人一区二区三区吃奶| 色噜噜狠狠狠综合曰曰曰88av| 日韩高清电影好看的电视剧电影| 国产精品高潮粉嫩av| 亚洲国内精品在线| 精品日本美女福利在线观看| 亚洲精品美女网站| 成人黄色在线播放| 欧美肥臀大乳一区二区免费视频| 亚洲影院污污.| 国产精品成熟老女人| 国产成人高清激情视频在线观看| 国产欧美精品久久久| 蜜月aⅴ免费一区二区三区| 国产精品美女久久久久av超清| 国产视频精品免费播放| 91高潮在线观看| 国模精品系列视频| 国产经典一区二区| 欧美在线精品免播放器视频| 97激碰免费视频| 欧美成人国产va精品日本一级| 日韩最新免费不卡| 精品成人国产在线观看男人呻吟| 性欧美xxxx交| 久久久精品视频在线观看| 7777免费精品视频| 黑人巨大精品欧美一区二区| 17婷婷久久www| 欧美精品久久久久| 欧美高清一级大片| 日韩成人在线视频观看| 欧美理论电影在线观看| 91精品国产电影| 色狠狠久久aa北条麻妃| 亚洲精品aⅴ中文字幕乱码| 久久久精品视频在线观看| 亚洲欧洲自拍偷拍| 欧美中文字幕在线观看| 国产欧美一区二区三区久久人妖| 日韩欧美在线看| 成人黄色网免费| 成人午夜激情免费视频| 欧美精品www| 久久久999国产| 久久手机免费视频| 亚洲第一精品夜夜躁人人躁| 国产不卡视频在线| 日韩成人久久久| 久久精品久久久久久国产 免费| 国产成人亚洲综合91| 91精品国产高清久久久久久| 亚洲经典中文字幕| 色一区av在线| 亚洲jizzjizz日本少妇| 欧美精品videossex88| 久久国产精品久久国产精品| 欧美成人剧情片在线观看| 日韩电影在线观看永久视频免费网站| 国产精品久久久久久久av大片| 97在线观看免费| 亚洲字幕在线观看| 欧美成人免费小视频| 欧美日韩国产精品一区二区三区四区| 97在线视频免费看| 亚洲老板91色精品久久| 日韩欧美中文第一页| www.欧美精品| 97高清免费视频| 亚洲女人天堂色在线7777| 韩国日本不卡在线| 91网站在线免费观看| 亚洲成人久久网| 欧美激情亚洲视频| 国产精品老女人精品视频| 欧美在线观看网站| 亚洲韩国日本中文字幕| 国产精品福利无圣光在线一区| 日韩精品免费视频| 欧美激情综合色| 成人国产精品免费视频| 国产精品久久久久7777婷婷| 欧美一级在线亚洲天堂| 精品福利樱桃av导航| 亚洲电影在线看| 欧美一级大片在线免费观看|