星期二, 7月 18, 2023

[SQL] 隱含轉換與 Index Seek - 多欄位

在這兩篇筆記
有紀錄到隱含轉換發生還是會跑 Index Seek 情況,沒想到遇上多欄位情況,也是從 char 隱含轉換至 nchar,但該隱含轉換欄位並非是多欄位索引第一欄位,仍然能跑 Index Seek

以下為模擬實務情況範例,tblNChar 為供應商系統、tblChar 為我方系統,該欄位資料對於我方來說只會是英數,但從供應商角度,為了配合不同客戶需求,開成 nchar、nvarchar 都是合理的
USE [AdventureWorks2019]
GO

DROP TABLE IF EXISTS tblChar
DROP TABLE IF EXISTS tblNChar

-- 建立 tblChar Table
CREATE TABLE [dbo].[tblChar]
(
	ColDateTime datetime not null ,
	ColChar char(10) not null ,
	CONSTRAINT [PK_tblChar] PRIMARY KEY CLUSTERED 
	(
		ColDateTime ASC , 
		ColChar ASC
	)
)
GO

-- 建立 tblNChar Table
CREATE TABLE [dbo].[tblNChar]
(
	ColDateTime datetime not null ,
	ColNChar nchar(50) not null ,
	CONSTRAINT [PK_tblNChar] PRIMARY KEY CLUSTERED 
	(
		[ColDateTime] ASC , 
		[ColNChar] ASC
	)
) 
GO

-- 模擬實務情況語法
SELECT NC.*
FROM tblNChar AS NC
WHERE NOT EXISTS
	(
			SELECT 1
			FROM tblChar AS C
			WHERE NC.ColDateTime = C.ColDateTime
				AND NC.ColNChar = C.ColChar
	)
	AND NC.ColDateTime >= '20230718'
	AND NC.ColDateTime < '20230719'
執行計畫截圖內
  • 搜尋述詞 (Seek Predicates):ColDateTime (多欄位索引第一欄位)
  • 述詞 (Predicates): ColNChar 和 ColChar (多欄位索引第二欄位)

沒有留言:

張貼留言