Tại sao không có quét toàn bộ (Trên SQL 2008 R2 và 2012)?
Dữ liệu kiểm tra:
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
Khi thực hiện truy vấn:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
Nhận cảnh báo (như mong đợi, vì so sánh dữ liệu nchar với cột varchar):
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
Nhưng sau đó tôi thấy kế hoạch thực hiện, và tôi có thể thấy, nó không sử dụng quét toàn bộ như tôi mong đợi, mà thay vào đó là tìm kiếm chỉ mục.
Tất nhiên, điều này là tốt, bởi vì trong trường hợp cụ thể này, việc thực thi nhanh hơn nhiều so với việc quét toàn bộ.
Nhưng tôi không thể hiểu làm thế nào máy chủ SQL đi đến quyết định thực hiện kế hoạch này.
Ngoài ra - nếu đối chiếu máy chủ sẽ là đối chiếu Windows ở cấp độ máy chủ và cấp độ cơ sở dữ liệu đối chiếu SQL Server, thì nó sẽ gây ra quét toàn bộ trên cùng một truy vấn.