如何为不平等查询建立索引?


10

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

select * 
from My_Table
where my_Float_column != 0 and my_Float_column is not null

如果可以,我不想为浮点型索引。执行计划是否足够聪明,可以使用如下所示的过滤索引(在这里我仅索引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

Answers:


11

执行计划是否足够聪明,可以使用如下所示的过滤索引(在这里我仅索引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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.