[英]Where Clause Index Scan - Index Seek
我有下表:
CREATE TABLE Test
(
Id int IDENTITY(1,1) NOT NULL,
col1 varchar(37) NULL,
testDate datetime NULL
)
insert Test
select null
go 700000
select cast(NEWID() as varchar(37))
go 300000
以下索引:
create clustered index CIX on Test(ID)
create nonclustered index IX_RegularIndex on Test(col1)
create nonclustered index IX_RegularDateIndex on Test(testDate)
當我查詢我的桌子時:
SET STATISTICS IO ON
select * from Test where col1=NEWID()
select * from Test where TestDate=GETDATE()
首先是進行索引掃描而第二個索引是搜索。 我希望他們兩個都必須進行索引搜索。 為什么第一個進行索引掃描?
由於NEWID()
函數返回的值為uniqueidentifier
數據類型,並且與為該列聲明的VARCHAR
數據類型不同,因此會生成隱式轉換。
試着將鼠標懸停在計划的SELECT
部分上,其中有一個“警告”標志。
由於比較數據類型之間存在不匹配,優化程序無法查看統計信息並估計表中具有該NEWID()
值的行數。
並且由於隱式轉換,優化器因此決定最好去獲取所有行(因此是SCAN
),然后將它們傳遞給FILTER
操作,在那里它將Col1
的值轉換為uniqueidentifier
數據類型然后刪除與篩選條件不匹配的其他行。
與返回datetime
值的GETDATE()
相反,該值與testDate
列具有相同的數據類型,因此不需要進行數據類型轉換,並且可以按原樣比較值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.