Sql-Server

為什麼我的過濾索引被忽略?

  • May 5, 2019
--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

查看查詢計劃,只要存在非過濾索引,就不會使用過濾索引。知道為什麼,我怎樣才能讓它使用過濾索引?

刪除非過濾索引nf會使優化器使用過濾索引f

事實上,當刪除非過濾索引時,增加行數以使 >10% 的行符合條件會導致表掃描。

由於 SQL Server 可以跳過 NULL 行來啟動範圍掃描,因此任一索引的成本是相同的,所以這對優化器來說基本上是拋硬幣。查看SQL Sentry Plan Explorer * 預設情況下和提示索引時的計劃(點擊放大):

在此處輸入圖像描述

在此處輸入圖像描述

由於這是一個折騰,我不知道強制SQL Server 選擇兩個同樣有效的選項之一會有什麼好處。

* 免責聲明:我為 SQL Sentry 工作。

引用自:https://dba.stackexchange.com/questions/74117