星期五, 8月 10, 2018

[SQL] 避免使用不等於

SARG 的一個原則 - 避免使用否定語法,EX:<>,調校時剛好有用上,記錄一下

第 27 行是關鍵條件,剛好了解這條件商業邏輯,派工單各工序數量不等於派工單數量情況,換句話說就是,各工序數量小於派工數量的情況,擔心誤會還特定跟同事確認,應該不太可能會有各工序完工數量,超過派工數量的情況才對
SELECT
  ..................
FROM 
  (
    SELECT
       ..................
    FROM pmsetorder AS s
      JOIN pmfinishdate AS f ON s.order_no = f.order_no
    WHERE
       ..................
  ) AS A
GROUP BY  ..................
UNION ALL
SELECT
   ..................
FROM 
  (
    SELECT
       ..................
    FROM 
    (
      SELECT
         ..................
      FROM
          ..................
        JOIN pmfinishdate AS F1 ON D.order_no = F1.order_no
                                  AND F1.doneqty <> S1.qty
                                  AND D.pid = F1.PID
           ..................
      WHERE
         ..................
    ) AS G
    GROUP BY  ..................
  ) AS P
第 27 行條件修正
-- 原語法
F1.doneqty <> S1.qty
-- 了解商業邏輯情況下改為
F1.doneqty < S1.qty
-- 完全不懂商業邏輯下會改為
F1.doneqty < S1.qty OR F1.doneqty > S1.qty
上述兩種改法都是可以得到相同結果,Statistics 雖然沒有甚麼變化,執行計劃成本降低不少

[SQL] 避免反向查詢-執行計劃比較

沒有留言:

張貼留言