星期二, 8月 15, 2017

[SQL] 複合索引效能

接獲同事訊問,為什麼這段 TSQL 短短的,竟然要跑到 8 秒以上,>.<
SELECT
    A.物料識別碼 ,
    ISNULL(k.物料識別碼, '') AS checked
FROM 
    (
        SELECT
            M.物料識別碼 ,
            ISNULL(Q.總庫存量, 0) AS 總庫存量
        FROM 物料資料表 AS M
            JOIN vw庫存數量 AS Q ON M.物料識別碼 = Q.物料識別碼
            JOIN vw物料主管單位 AS P ON M.物料識別碼 = P.物料識別碼
        WHERE M.物料使用狀態 = ''
            AND P.部門單位 = 倉庫單位編號
            AND Q.總庫存量 > 0
    ) AS A
    LEFT JOIN 物料盤點 AS k ON A.物料識別碼 = k.物料識別碼 AND k.年度 = '106' AND k.是否完成 = 1
查看執行計畫和 Logical Read 發現,[物料主管單位 Table] 的資料輸出爆量了

[SQL] 複合索引效能-1
確認 [物料主管單位 Table] 上的 Index,發現 PK 是複合欄位,且竟然設反了,應該是 [物料 + 組別],設成 [組別 + 物料],修正順序後,再執行語法確認,結案

[SQL] 複合索引效能-2
附上該 [物料主管單位 Table] Logical Read 和語法執行時間資訊

修正前修正後
時間8,237ms140ms
Logical Read217,824456

沒有留言:

張貼留言