열의 캐스트가 정확히 동일한 데이터 유형과 길이에 있고 탐색 술어가 리터럴 인 경우 실제로이를 무시하거나이를 no-op로 취급하고 인덱스가 동등성을 찾는 것 같습니다.
Seek Keys[1]: Prefix: [tempdb].[dbo].[#test].name = Scalar Operator(N'rpc')
열의 캐스트가 동일한 데이터 유형이지만 길이가 길고 탐색 술어가 문자열 리터럴 인 경우 인덱스 스캔이 발생합니다. 이것은 분명히 피해야합니다.
열의 캐스트가 동일한 데이터 유형이고 길이가 같거나 더 길고 seek 술어가 로컬 변수 인 경우 계산 스칼라 연산자를 실행 계획에 추가합니다. 이것은 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