Neden tam tarama yok (SQL 2008 R2 ve 2012'de)?
Test verisi:
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
Sorgu çalıştırıldığında:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
Uyarı alın (beklendiği gibi, nchar verilerini varchar sütunuyla karşılaştırdığınızda):
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
Ama sonra yürütme planını görüyorum ve görebildiğim gibi tam taramayı kullanmıyor, dizin arama yerine görebiliyorum.
Tabii ki, bu iyi bir şey, çünkü bu özel durumda yürütme tam taramadan çok daha hızlıdır.
Ama nasıl SQL Server bu planı yapmak için karar geldi anlayamıyorum.
Ayrıca, sunucu harmanlama sunucu düzeyinde Windows harmanlama ve SQL Server harmanlama veritabanı düzeyinde olacaksa, aynı sorguda tam taramaya neden olur.