假设我有一张桌子:
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)它执行聚簇索引扫描。与复杂的多连接查询相同。
答案 0 :(得分:0)
这取决于索引的选择性。
答案 1 :(得分:0)
正如你所说,MyTable的column1有一半的值不是NULL而不是空字符串。因此,如果您使用过滤器WHERE column1 is not null and column1 <> ''
在column1上创建索引,并且执行计划DOES使用该索引,则应使用索引搜索。
如果未使用索引种子,那么我们需要检查估计的行和实际行,如果它们相差很多行,则需要更新统计数据。
第一次查询: 选择 ... 来自MyTable 加入TableA ... 加入TableB ...... ... 其中column1不为null且column1&lt;&gt; ''
大多数情况下执行计划都会使用索引扫描。