列のキャストがまったく同じデータ型と長さであり、シーク述語がリテラルである場合、実際にそれを無視するか、no-opとして扱い、同等のインデックスシークを行います。
Seek Keys[1]: Prefix: [tempdb].[dbo].[#test].name = Scalar Operator(N'rpc')
列のキャストが同じデータ型で、長さが長く、シーク述語が文字列リテラルの場合、インデックススキャンが発生します。これは明らかに避けるべきです。
列のキャストが同じデータ型で同じ長さ以上であり、シーク述語がローカル変数である場合、計算スカラー演算子が実行プランに追加されます。GetRangeThroughConvert
範囲を呼び出して出力します。
この範囲はインデックスシークを行うために使用され、かなり効率的です
Seek Keys[1]:
Start: [tempdb].[dbo].[#test].name > Scalar Operator([Expr1006]),
End: [tempdb].[dbo].[#test].name < Scalar Operator([Expr1007])
テストコード
SELECT *
INTO #test
FROM [master].[dbo].[spt_values]
CREATE NONCLUSTERED INDEX [ixname] ON #test
(
[name] ASC
)
DECLARE @name NVARCHAR(MAX)
SET @name = 'rpc'
SELECT name
FROM #test
WHERE CAST(name AS NVARCHAR(35))= @name --Cast the same and local variable
SELECT name
FROM #test
WHERE CAST(name AS NVARCHAR(MAX))=@name --Cast to longer and local variable
SELECT name
FROM #test
WHERE CAST(name AS NVARCHAR(35))='rpc' --Cast the same and literal
SELECT name
FROM #test
WHERE CAST(name AS NVARCHAR(MAX))='rpc' --Cast to longer and literal