전체 스캔이없는 이유는 무엇입니까 (SQL 2008 R2 및 2012)?
테스트 데이터 :
DROP TABLE dbo.TestTable
GO
CREATE TABLE dbo.TestTable
(
TestTableID INT IDENTITY PRIMARY KEY,
VeryRandomText VarChar(50),
VeryRandomText2 VarChar(50)
)
Go
Set NoCount ON
Declare @i int
Set @i = 0
While @i < 10000
Begin
Insert Into dbo.TestTable(VeryRandomText, VeryRandomText2)
Values(Cast(Rand()*10000000 as VarChar(50)), Cast(Rand()*10000000 as VarChar(50)));
Set @i = @i + 1;
End
Go
CREATE Index IX_VeryRandomText On dbo.TestTable
(
VeryRandomText
)
Go
쿼리를 실행할 때 :
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
nchar 데이터를 varchar 열과 비교하기 때문에 예상대로 경고를 받으십시오.
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
그러나 실행 계획을 보았을 때 예상대로 전체 스캔을 사용하지 않고 대신 인덱스 검색을 사용하고 있음을 알 수 있습니다.
물론,이 경우에는 전체 스캔이 수행되는 것보다 실행 속도가 훨씬 빠르기 때문에이 방법이 좋습니다.
그러나이 계획을 결정하기 위해 SQL 서버가 어떻게 결정되었는지 이해할 수 없습니다.
또한 서버 데이터 정렬이 서버 수준 및 SQL Server 데이터 정렬 데이터베이스 수준의 Windows 데이터 정렬 인 경우 동일한 쿼리에서 전체 검색이 수행됩니다.