เหตุใดจึงไม่มีการสแกนเต็มรูปแบบ (ใน 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 ตัดสินใจเลือกแผนนี้อย่างไร
นอกจากนี้หากการเปรียบเทียบเซิร์ฟเวอร์จะเป็น Windows collations ในระดับเซิร์ฟเวอร์และระดับฐานข้อมูลการเปรียบเทียบ SQL Server ก็จะทำให้เกิดการสแกนแบบเต็มในแบบสอบถามเดียวกัน