星期一, 7月 30, 2018

[SQL] 避免 Group By 跨資料表欄位

[SQL] 限制資料筆數 續篇,解決資料大量輸出後,發現有 Group By 跨資料表欄位情況,白話說就是 JOIN Table 之後才對多個 Table 欄位進行彙總

改善前 TSQL 如下
SELECT
  .................
FROM 派工工序 AS F
  .................
  LEFT JOIN 
    (
      SELECT
        KK.派工單號 ,
        KK.工序 ,
        KK.送達與否 ,
        O.部門名稱 ,
        MAX(KK.預定日期) AS 預定日期 ,
        MAX(KK.預約者) AS 預約者 ,
        MAX(KK.預約時段) AS 預約時段 ,
        MAX(KK.優先順序) AS 優先順序 ,
      FROM 物料預約 AS KK
        JOIN 部門 AS O ON KK.處理部門編號 = O.部門編號
      GROUP BY KK.派工單號 , KK.工序 , KK.送達與否 , O.部門名稱
    ) AS K ON K.派工單號 = F.派工單號
             AND K.工序 = F.工序
  .................  
WHERE F.部門編號 = 'D203'
  AND F.已完工數量 < S.派工數量
ORDER BY
  .................
把 TSQL 語法改為 GROUP BY 彙總後再 JOIN Table
SELECT
    T.* ,
    O.部門名稱
FROM
  (
    SELECT
      KK.派工單號 ,
      KK.工序 ,
      KK.送達與否 ,
      KK.處理編號 ,
      MAX(KK.預定日期) AS 預定日期 ,
      MAX(KK.預約者) AS 預約者 ,
      MAX(KK.預約時段) AS 預約時段 ,
      MAX(KK.優先順序) AS 優先順序
    FROM 物料預約 AS KK
    GROUP BY KK.派工單號 , KK.工序 , KK.送達與否 , KK.處理部門編號
  ) AS T
  JOIN 部門 AS O ON T.處理部門編號 = O.部門編號
改善前執行計畫
改善後執行計畫,Sort 操作子還在,有點礙眼,Orz


執行計畫比較
估計的子樹成本比較
TSQL 執行的 Statistics 是沒有甚麼改善,改善後執行計畫看起來還是很糟糕,但執行計畫成本改善不少

沒有留言:

張貼留言