模擬該情況,先建立 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
完整執行計畫 重點的 Hash Join operator 和隱含轉換,只擷取重點來顯示
解決方式就把資料形態改為一致 (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
沒有留言:
張貼留言