該 Query 是 Linked Server 抓取 remote 資料並進行比對後 insert 回 Local 端保留,一看到是 Linked Server 原以為是把 remote 資料都抓回 Local 端後才進行篩選導致,實際執行後發現是 Local Table 缺少 Index 造成,把 missing index 補上去就結案
TSQL 語法示意
INSERT INTO LocalERTable
(
ColList
)
SELECT
ColList
FROM LinkedServerRemoteTable AS L
JOIN LocalECTable AS C ON L.KeyCol = C.KeyCol
WHERE NOT EXISTS (
SELECT 1 AS data
FROM LocalERTable AS R
WHERE R.KeyCol = L.KeyCol
AND R.SmallDateTimeCol = L.SmallDateTimeCol)
AND L.SmallDateTimeCol >= @Date
AND L.SmallDateTimeCol < DATEADD(D,1,@Date)
AND C.IsValidCol = 0
執行計畫觀察和效能改善
索引建立前:Remote Query 只吐出 117 筆資料
- EC Table 12,753 (該 Table 只有 237 筆資料)
- ER Table 6,975 筆資料出來處理
索引建立後:Remote Query 吐出 117 筆資料
- EC Table 0 筆資料
- ER Table 117 筆資料
效能改善
missing index 觀察
之前有筆記過 SSMS 顯示的 missing index 建議不會是最佳 - [SQL] 使用 XML 執行計畫觀察遺漏索引建議,這次也發生同樣的情況,但之前沒有特別注意 Inequality
Inequality 是代表 <>、> 或 NOT IN,該建議欄位請歸類在索引欄位內,不是包含在包含欄位 (include) 內,以該例來說明,
下圖建議索引為 CREATE INDEX IndexName ON TableName (欄位 4) INCLUDE(欄位 3)
下圖建議索引為 CREATE INDEX IndexName ON TableName (欄位4 , 欄位3)
沒有留言:
張貼留言