簡體   English   中英

條款索引掃描 - 索引尋求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM