星期三, 6月 02, 2021

[SQL] Like - 估計、實際資料

延續該筆記 - [SQL] Like - sp_executesql,平常確認派工相關商業邏輯時,都是依靠 [未結案非叢集索引] 來限制資料,心理一直有個執念,執行計畫就是要從它開始才是,所以有測試過下列方式企圖來改變
  • 強制指定 [未結案非叢集索引]  來跑,有點意外竟然沒有用
  • 加入條件來變化 SARG,有成功但執行計畫增加 1 %
WHERE 單號 like LIKE 'B_____12345%'
	AND 單號 > '' -- 加入該條件
改變後執行計畫
 
[SQL] Like - 估計、實際資料-3
Index Seek Operator
 
[SQL] Like - 估計、實際資料-1
從 operator 可以看到 Predicate 是 like 單號條件,但 Seek Predicate 是[單號大於空值]

  • 心血來潮用 Parameter Sniffering Local Variable,結果跑出很糟糕的統計數字和執行計畫
EXEC sp_executesql N'
	DECLARE @內部派工參數 AS char(11) = @外部派工參數
	DECLARE @內部結案參數 AS char(1) = @外部結案參數

	SELECT 欄位
	FROM 資料表名稱
	WHERE 單號 like @內部派工參數 + ''%'') 
		AND 是否結案 = @內部結案參數 )  '
	,N'@外部單號參數 char(11),@外部結案參數 char(1)'
	,@外部單號參數 = 'B_____12345'
	,@內部結案參數 = ''
以前沒有在看 operator 上的數字,有也是轉過去 Plan Explorer 上觀察,看哪一個 operator 被顯示為紅色,表示成本較高而以,這次是真的這破百數字太顯著引起注意,原來 SSMS 上會把 operator 的 [實際資料列數目] 和 [估計的資料列數目] 打在上面並計算出百分比 
實際資料列數目 / 估計的資料列數目 (9986 / 7063) = 141% ,表示實際數量遠大於估計數量
[SQL] Like - 估計、實際資料-2

沒有留言:

張貼留言