星期六, 11月 14, 2020

[SQL] 探查剩餘 (Probe Residual)

Turning 時發現執行計畫很詭異,因為清楚該 TSQL 商業邏輯,所以注意到 Hash Join 存在和其  [探查剩餘 (Probe Residual)] 資訊,後來發現是 JOIN ON 欄位資料型態不一致造成隱含轉換,再加上沒有 Index 造成該現象

模擬該情況,先建立 tblChar 和 tblNChar 兩個 Table
USE [AdventureWorks2017]
GO

CREATE TABLE [dbo].[tblChar]
(
	[NOs] [char](11) NOT NULL, -- 資料形態為 char
	CONSTRAINT [PK_tblChar] PRIMARY KEY CLUSTERED ([NOs] ASC)
)
GO

CREATE TABLE [dbo].[tblNChar]
(
	[ID] [int] NOT NULL,
	[Nos] [nchar](11) NULL, -- 資料形態為 nchar
	CONSTRAINT [PK_tblNChar] PRIMARY KEY CLUSTERED 
	(
		[ID] ASC
	)
) 
GO
針對兩個 Table 進行 JOIN,來呈現 Hash Join 內有 Probe Residual 情況
SELECT T1.*
FROM tblChar AS T1
	JOIN tblNChar AS T2 ON T1.NOs = T2.NOs
完整執行計畫 

[SQL] 探查剩餘 (Probe Residual)-1

重點的 Hash Join operator 和隱含轉換,只擷取重點來顯示

[SQL] 探查剩餘 (Probe Residual)-2

[SQL] 探查剩餘 (Probe Residual)-3 
解決方式就把資料形態改為一致 (char(11)) 並加上 Index 結案,謎之音:只存英數資料,為什麼要開成 unicdoe 欄位形態阿,>.<

以前對 Hash Join 認知,只存在 OLTP 系統內是要關注的重點,趁這次機會找些文章來更了解它

20201117 朋友根據文章內容試時,發現執行計畫不一樣,跑 Nested Loop,該點在自建的模擬環境內也會發生,可以透過連結提示來看到有 Hash Join 的執行計畫
SELECT T1.*
FROM tblChar AS T1
	INNER Hash JOIN tblNChar -- 連結提示,強迫 TSQL 跑 Hash Join
	AS T2 ON T1.NOs = T2.NOs

沒有留言:

張貼留言