我有一个查询,它在 column 上有一个可选的 where 条件classID(not unique)
。这同样classID
被显示为各种其他查询中的选择列。目前我将 classID 作为索引中的包含列idx
,所以我认为当 classID 在 select 语句中时将使用 idx。当查询具有 classID 的 where 条件时,我是否必须为 classID 创建一个非聚集索引作为键列?
对此是否为所有 where 子句列单独创建感到困惑non-clustered indexes
。?
不,不是。在查询计划中选择的索引取决于查询优化器决定哪个索引最能满足查询要求。如果您的索引键列与您的查询谓词匹配或非常相似,那么它可能会选择该索引。
在 INCLUDE 列中包含 ClassID 仅意味着查询计划不需要键查找来检索有关查询中返回的行的附加数据。如果 ClassID 是谓词,则将其放在索引的 INCLUDE 列中不会导致优化器明确选择该索引。
您需要创建最能满足最常见数据访问的索引。例如,如果您创建了一堆具有单个键列和许多包含列的索引,但您的查询有许多谓词和很少的选择列,那么您的索引策略不太可能达到应有的效率。
当您开始使用索引调整\设计时,一个好的起点/经验法则是每个表不超过 5 个索引,每个索引不超过 5 列。这有助于您对创建的索引以及如何设计它们来满足大多数查询更有选择性。
这不是一个硬性规定,它只是帮助您考虑与查询相关的索引策略。
您不会为每个谓词创建单独的索引,因为优化器可能只使用其中一个,然后执行一堆键查找。使用以下基本准则设计索引:
这些不是硬性规定,并且再次不要设计索引来满足单个查询。您需要分析您的数据访问特征并制定索引策略,以使用最少的索引满足最多的查询,从而获得最大的效率。
一些不错的资源:
SQL Server 索引基础
SQL Server 索引体系结构和设计指南
SQL Server 索引基本设计和指南
设计有效的非聚集索引