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

Ard*_*oli 3 sql indexing sql-server-2008-r2 filtered-index

当我读这本书时

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

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

  Create index `<index_name>` on `<table_name>`
Run Code Online (Sandbox Code Playgroud)

或者

  Create index `<index_name>` on `<table_name>` Where (`<Conditions>`)
Run Code Online (Sandbox Code Playgroud)

但是不知道有什么好处?

What are the benefits of a filtered index ?

哪些列最常用于Where conditions

Dam*_*ver 5

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

Create unique index IX_Contacts on Contacts(User_ID) Where (IsDefault=1)
Run Code Online (Sandbox Code Playgroud)

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

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


ste*_*ary 1

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

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

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