フルスキャンがないのはなぜですか(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照合である場合、同じクエリでフルスキャンが発生します。