为什么在创建索引时使用Where子句?

时间:2013-11-25 11:07:25

标签: sql sql-server-2008-r2 indexing filtered-index

当我阅读this book时,

我发现我可以创建一个具有where条件的索引。

我发现我们可以像这样创建索引

  Create index `<index_name>` on `<table_name>`

或者

  Create index `<index_name>` on `<table_name>` Where (`<Conditions>`)

但我不知道有什么好处?

What are the benefits of a filtered index

Where conditions中最常用的哪一列?

2 个答案:

答案 0 :(得分:4)

这样做的明显原因是使索引更具选择性,或者使用它来应用约束:

Create unique index IX_Contacts on Contacts(User_ID) Where (IsDefault=1)

对于每个User_ID,他们可能在Contacts表中只有一个,但只有一个默认联系人 - 但是他们可以拥有与系统中其他约束一样多的非默认联系人将允许他们创建。

类似地,尝试查找用户的默认联系人的查询更有可能使用此索引,因为它非常狭窄且具有选择性 - 如果只有10%的联系人是用户的默认联系人,那么此索引将远小于(User_ID,IsDefault)上的索引(也可以满足这样的查询)

答案 1 :(得分:1)

我们的一些数据库中有一些大表,其中有特定的列通常是空的,并且访问这些表的大多数查询只是从表中选择特定列不为空的数据。

如果索引上没有过滤器,我们必须为每一行索引整个表,包括那些我们永远不会通过查询访问的行。

使用索引上的过滤器,当查询上的谓词与索引上的过滤器匹配时,查询运行得更快,因此优化器会选择要使用的小得多的索引。