【问题标题】: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】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-11-21
        • 2021-02-07
        • 2012-06-11
        • 2011-02-01
        • 2018-08-16
        • 2014-08-20
        • 1970-01-01
        • 2012-12-24
        相关资源
        最近更新 更多