非选择性列的最佳索引类型是什么?

时间:2016-11-02 11:45:15

标签: sql-server performance sql-server-2008 indexing

假设我有一张桌子:

create table MyTable
(
  column1 varchar(150),
  column2 ...,
  column3 ...,
  ...
)

Column1包含40%的空记录,10%的空('')值,其余的是一些有意义的值。 我有许多查询只适用于非空记录:

select ...
from MyTable
join TableA ...
join TableB ...
...
where column1 is not null and column1 <> ''

但是没有查询按照有意义的column1值过滤数据集:

select column2
from MyTable
where column1 = 'abcde'  -- NOT COMMON

通过在column1上引入索引来考虑一半行似乎是一个好主意。我试图使用简单的非聚集索引和过滤索引:

CREATE NONCLUSTERED INDEX IX_MyTable_column1
    ON dbo.MyTable(column1)
    WHERE column1 is not null and column1 <> ''

但优化工具不想使用它,我在执行时间内也没有任何好处。

我可以加强此类查询以及最合适的索引类型吗?

更新

实际上,索引用于只有表和精确索引谓词的简单查询中,但是如果我添加额外的谓词,例如 column2 in(4,7,9)它执行聚簇索引扫描。与复杂的多连接查询相同。

2 个答案:

答案 0 :(得分:0)

这取决于索引的选择性。

Do indexes work in NOT IN or <> clause?

答案 1 :(得分:0)

正如你所说,MyTable的column1有一半的值不是NULL而不是空字符串。因此,如果您使用过滤器WHERE column1 is not null and column1 <> ''在column1上创建索引,并且执行计划DOES使用该索引,则应使用索引搜索。

如果未使用索引种子,那么我们需要检查估计的行和实际行,如果它们相差很多行,则需要更新统计数据。

第一次查询:     选择 ...     来自MyTable     加入TableA ...     加入TableB ......     ...     其中column1不为null且column1&lt;&gt; ''

大多数情况下执行计划都会使用索引扫描。

相关问题