星期三, 5月 05, 2021

[SQL] 遺失索引案例

從 [資料收集-查詢統計資料紀錄] 報表內發現,有一個 Query 統計圖特別突出

[SQL] 遺失索引案例-1

該 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 筆資料出來處理
[SQL] 遺失索引案例-2

索引建立後:Remote Query 吐出 117 筆資料
  • EC Table 0 筆資料
  • ER Table 117 筆資料
  [SQL] 遺失索引案例-3
效能改善

索引建立前索引建立後
關鍵 Table Logical Read139,587705
CPU Time1,562ms15ms

missing index 觀察

之前有筆記過 SSMS 顯示的 missing index 建議不會是最佳 - [SQL] 使用 XML 執行計畫觀察遺漏索引建議,這次也發生同樣的情況,但之前沒有特別注意 Inequality

Inequality 是代表 <>、> 或 NOT IN,該建議欄位請歸類在索引欄位內,不是包含在包含欄位 (include) 內,以該例來說明,

下圖建議索引為 CREATE INDEX IndexName ON TableName (欄位 4)  INCLUDE(欄位 3)

[SQL] 遺失索引案例-4

下圖建議索引為 CREATE INDEX IndexName ON TableName (欄位4 , 欄位3)

[SQL] 遺失索引案例-5

沒有留言:

張貼留言