Aka*_*ash 3 performance index sql-server filtered-index query-performance
--Setup, actual queries after the space
--create table fltrind (a integer,b integer)
truncate table fltrind
DROP INDEX fltrind.nf
DROP INDEX fltrind.f
DECLARE @i integer
SET @i=0
while @i<100
BEGIN
INSERT INTO fltrind(a) values(@i)
SET @i=@i+1
END
INSERT INTO fltrind(a,b) values(9000,0900)
insert into fltrind(a,b)
select top 100000 f1.a,f1.b from fltrind f1 , fltrind f2
create nonclustered index nf on fltrind(b) INCLUDE(a)
create nonclustered index f on fltrind(b) INCLUDE(a) where b is not null
UPDATE STATISTICS fltrind WITH FULLSCAN
select a from fltrind where b is not null
DROP INDEX fltrind.nf
UPDATE STATISTICS fltrind WITH FULLSCAN
select a from fltrind where b is not null
Run Code Online (Sandbox Code Playgroud)
查看查询计划,只要存在非过滤索引,就不会使用过滤索引。知道为什么,以及如何让它使用过滤索引?
删除非过滤索引nf使优化器使用过滤索引f。
事实上,增加 rowcount 使得 >10% 的行符合条件会导致在删除非过滤索引时进行表扫描。
由于 SQL Server 可以跳过 NULL 行来开始范围扫描,因此任何一个索引的成本都是相同的,因此这对于优化器来说基本上是一个掷硬币的问题。查看SQL Sentry Plan Explorer * 默认情况下以及提示索引时的计划(单击放大):
由于这是一个折腾,我不知道强迫SQL Server 选择两个同样有效的选项之一会给您带来什么好处。
* 免责声明:我为 SQL Sentry 工作。