【问题标题】:Why use the Where clause when creating an index?为什么在创建索引时使用 Where 子句?
【发布时间】:2013-11-25 11:07:25
【问题描述】:
当我读到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 中哪些列最常用?
【问题讨论】:
标签:
sql
sql-server-2008-r2
indexing
filtered-index
【解决方案1】:
这样做的明显原因是使索引更具选择性,或者使用它来应用约束:
Create unique index IX_Contacts on Contacts(User_ID) Where (IsDefault=1)
表示,对于每个User_ID,他们在Contacts 表中可能有一个,并且只有一个默认联系人 - 但他们可以有尽可能多的非默认联系人,因为系统中的其他约束允许他们创建。
类似地,尝试为用户查找默认联系人的查询更有可能使用此索引,因为它非常狭窄且有选择性 - 如果只有 10% 的联系人是用户的默认联系人,那么此索引将远小于(User_ID,IsDefault) 上的索引(也可以满足这样的查询)
【解决方案2】:
我们的一些数据库中有一些大表,其中的特定列通常为空,访问这些表的大多数查询仅从该特定列不为空的表中选择数据。
如果不对索引进行过滤,我们必须索引整个表的每一行,包括那些我们永远不会通过查询访问的行。
使用索引上的过滤器,查询运行得更快,因为查询上的谓词与索引上的过滤器匹配,因此优化器选择要使用的小得多的索引。