如何索引不等式查询?

Nei*_*l P 12 index sql-server sql-server-2008-r2

我有一个基于浮点列值排除数据的查询

select * 
from My_Table
where my_Float_column != 0 and my_Float_column is not null
Run Code Online (Sandbox Code Playgroud)

如果可以的话,我不想索引浮点类型。执行计划是否足够聪明以使用像下面这样的过滤索引(我只索引 0 和 null 值)来提高性能?

CREATE NONCLUSTERED INDEX IX_My_Table_Float_Filtered
    ON My_Table (my_Float_column)
    WHERE my_Float_column = 0 or my_Float_column is null
Run Code Online (Sandbox Code Playgroud)

Pau*_*ite 12

执行计划是否足够聪明以使用像下面这样的过滤索引(我只索引 0 和 null 值)来提高性能?

不。SQL Server 中没有直接支持您似乎想到的那种单运算符行拒绝。

更一般地说,过滤索引对给定查询没有直接帮助,无论如何都不是有效的索引过滤器定义。您可以创建一个包含这些谓词的索引视图,但作为定位目标查询的行的方式,它仍然没有帮助。您可以重写查询以使用索引视图来排除使用单独的完整扫描获取的行,但很难看出这通常是一个好主意。

您可以获得的最接近的可能是对填充位图过滤器的索引视图进行扫描,并将该过滤器应用为目标表的完整扫描的一部分。可靠地获取此查询计划形状可能具有挑战性。

您还可以使用CASE表达式使用索引的持久计算列,但这同样需要重写原始查询,并且需要存储表中的每一行以及索引。

从给出的信息来看,您能做的最好的事情似乎是将索引定义为:

CREATE NONCLUSTERED INDEX IX_dbo_My_Table__Float_Filtered
ON dbo.My_Table (my_Float_column)
WHERE 
    my_Float_column <> 0 
    AND my_Float_column IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)