国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

通過調整表union all的順序優化SQL

2024-07-21 02:48:32
字體:
來源:轉載
供稿:網友
通過調整表union all的順序優化SQL

  操作系統:Windows xp

  數據庫版本:SQL Server 2005

  今天遇到一個SQL,過濾條件是自動生成的,因此,沒法通過調整SQL的謂詞達到優化的目的,只能去找SQL中的“大表”。有一個視圖返回的結果集比較大,如果能調整的話,也只能調整該視圖了。

  看了一下該視圖的結構,里面還套用了另一層視圖,直接看最里層視圖的查詢SQL。

SELECT  a.dfeesum_no ,        a.oPR_amt - ISNULL(b.dec_pay, 0) - ISNULL(b.dec_corrpay, 0)        - ISNULL(b.dec_deduamt, 0) dec_amt ,        a.dec_camt - ISNULL(b.dec_pay, 0) - a.dec_comprate        * ISNULL(b.dec_deduamt, 0) dec_compamt ,        a.dec_ramt - ISNULL(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )        * ISNULL(b.dec_deduamt, 0) dec_corramt ,        a.dec_qty - ISNULL(b.dec_qty, 0) - ISNULL(b.dec_deduqty, 0) opr_qty ,        ISNULL(b.dec_pay, 0) dec_pay ,        ISNULL(b.dec_corrpay, 0) dec_corrpay ,        ISNULL(b.dec_deduqty, 0) dec_deduqty ,        ISNULL(b.dec_deduamt, 0) dec_deduamt ,        ISNULL(b.dec_qty, 0) dec_qtyFROM    ctlm8686 a        LEFT JOIN ( SELECT  dfeesum_no ,                            SUM(dec_ramt) dec_pay ,                            SUM(dec_corramt) dec_corrpay ,                            SUM(dec_qty) dec_qty ,                            SUM(CASE WHEN flag_dedu = '1' THEN dec_deduamt                                     ELSE 0                                END) dec_deduamt ,                            SUM(CASE WHEN flag_dedu = '1' THEN dec_deduqty                                     ELSE 0                                END) dec_deduqty                    FROM    dfeepay_03                    GROUP BY dfeesum_no                  ) b ON a.dfeesum_no = b.dfeesum_noUNION ALLSELECT  a.dfeesum_no ,        a.dec_amt - ISNULL(b.dec_pay, 0) - ISNULL(b.dec_corrpay, 0)        - ISNULL(b.dec_deduamt, 0) dec_amt ,        a.dec_compamt - ISNULL(b.dec_pay, 0) - a.dec_comprate        * ISNULL(b.dec_deduamt, 0) dec_compamt ,        a.dec_corramt - ISNULL(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )        * ISNULL(b.dec_deduamt, 0) dec_corramt ,        a.opr_qty - ISNULL(b.dec_qty, 0) - ISNULL(b.dec_deduqty, 0) opr_qty ,        ISNULL(b.dec_pay, 0) dec_pay ,        ISNULL(b.dec_corrpay, 0) dec_corrpay ,        ISNULL(b.dec_deduqty, 0) dec_deduqty ,        ISNULL(b.dec_deduamt, 0) dec_deduamt ,        ISNULL(b.dec_qty, 0) dec_qtyFROM    dfeeapp_03 a        LEFT JOIN ( SELECT  dfeesum_no ,                            SUM(dec_ramt) dec_pay ,                            SUM(dec_corramt) dec_corrpay ,                            SUM(dec_qty) dec_qty ,                            SUM(CASE WHEN flag_dedu = '1' THEN dec_deduamt                                     ELSE 0                                END) dec_deduamt ,                            SUM(CASE WHEN flag_dedu = '1' THEN dec_deduqty                                     ELSE 0                                END) dec_deduqty                    FROM    dfeepay_03                    GROUP BY dfeesum_no                  ) b ON a.dfeesum_no = b.dfeesum_no

  返回結果集有1433891行,其中

  SELECT COUNT(*) FROM dfeepay_03 --1103914  SELECT COUNT(*) FROM ctlm8686 --1131586  SELECT COUNT(*) FROM dfeeapp_03--302305

  上述SQL腳本中,子查詢是相同的,即對子查詢進行了兩次掃描,可以考慮先讓dfeeapp_03和ctlm8686union all,再left joindfeepay_03 。同時,對于子查詢,先讓dfeepay_03 表先查詢出flag_dedu = '1'的數據,就不用再進行case when判斷了。

  改寫后的SQL如下

SELECT  a.dfeesum_no ,        a.opr_amt - ISNULL(b.dec_pay, 0) - ISNULL(b.dec_corrpay, 0)        - ISNULL(b.dec_deduamt, 0) dec_amt ,        a.dec_camt - ISNULL(b.dec_pay, 0) - a.dec_comprate        * ISNULL(b.dec_deduamt, 0) dec_compamt ,        a.dec_ramt - ISNULL(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )        * ISNULL(b.dec_deduamt, 0) dec_corramt ,        a.dec_qty - ISNULL(b.dec_qty, 0) - ISNULL(b.dec_deduqty, 0) opr_qty ,        ISNULL(b.dec_pay, 0) dec_pay ,        ISNULL(b.dec_corrpay, 0) dec_corrpay ,        ISNULL(b.dec_deduqty, 0) dec_deduqty ,        ISNULL(b.dec_deduamt, 0) dec_deduamt ,        ISNULL(b.dec_qty, 0) dec_qtyFROM    ( SELECT    a.dfeesum_no ,                    a.opr_amt ,                    a.dec_camt ,                    a.dec_comprate ,                    a.dec_ramt ,                    a.dec_qty          FROM      ctlm8686 a          UNION ALL          SELECT    a.dfeesum_no ,                    a.dec_amt ,                    a.dec_compamt ,                    a.dec_comprate ,                    a.dec_corramt ,                    a.opr_qty          FROM      dfeeapp_03 a        ) a        LEFT JOIN ( SELECT  dfeesum_no ,                            SUM(dec_ramt) dec_pay ,                            SUM(dec_corramt) dec_corrpay ,                            SUM(dec_qty) dec_qty ,                            SUM(dec_deduamt) dec_deduamt,                            SUM(dec_deduqty) dec_deduqty                    FROM   dfeepay_03                    WHERE flag_dedu = '1'                    GROUP BY dfeesum_no                  ) b ON a.dfeesum_no = b.dfeesum_no                

  跑這個視圖的查詢語句,從原來的一分半鐘降到一分鐘,對于整個SQL而言,則從原來跑幾分鐘的直接10S出結果。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台州市| 铜鼓县| 阳新县| 泰顺县| 金寨县| 霞浦县| 清苑县| 张家界市| 买车| 锡林郭勒盟| 哈密市| 阳朔县| 永平县| 博客| 甘肃省| 乌恰县| 通州区| 读书| 策勒县| 灵山县| 丹江口市| 博白县| 岱山县| 吉木乃县| 罗平县| 南部县| 漯河市| 突泉县| 鹿泉市| 治县。| 炎陵县| 乌兰浩特市| 内江市| 大宁县| 宜阳县| 商洛市| 克拉玛依市| 固镇县| 吉水县| 郁南县| 青龙|