Sql-Server
為什麼我的過濾索引被忽略?
--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 工作。