繁体   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