有紀錄到隱含轉換發生還是會跑 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 (多欄位索引第二欄位)
沒有留言:
張貼留言