Sql server 我是否需要创建所有可能组合的数据库索引?

Sql server 我是否需要创建所有可能组合的数据库索引?,sql-server,indexing,sql-server-2012,Sql Server,Indexing,Sql Server 2012,我的数据库表中有一个索引: [ArcadeID] ASC, [Published] ASC, [AccessMode] ASC, [ContentTypeID] ASC, [SupportedDeviceTypes] ASC, [LanguageID] ASC 最后三列ContentTypeID、SupportedDeviceTypes和LanguageID都是可选的。当应用某些筛选器时,在列出街机中的所有游戏时,将使用此索引 如果这些列包含/排除在所有不同的组合中,为了获得最大的查询性能,我

我的数据库表中有一个索引:

[ArcadeID] ASC,
[Published] ASC,
[AccessMode] ASC,
[ContentTypeID] ASC,
[SupportedDeviceTypes] ASC,
[LanguageID] ASC
最后三列
ContentTypeID
SupportedDeviceTypes
LanguageID
都是可选的。当应用某些筛选器时,在列出街机中的所有游戏时,将使用此索引


如果这些列包含/排除在所有不同的组合中,为了获得最大的查询性能,我是否需要创建此索引的所有可能组合,或者上面的索引是否已经覆盖了所有组合?

搜索索引时,将遍历键的第一列,然后遍历第二列等

您是说前3列是必填的。如果搜索精确匹配,则这3列的不同顺序不需要不同的索引。但是,如果您使用通配符搜索(例如像“[RW]”这样的AccessMode),那么它确实很重要

对于可选列,顺序也很重要,但前提是到那时(在确定确切的ArcadeID、Published和AccessMode之后),选择仍然太大


使用精确匹配搜索时(如上所述),前3个必填列的顺序最好基于统计特性。应首先列出最具选择性的列,然后列出下一个最具选择性的列。

无论您在何处询问,您都需要提供一些详细信息。如果这是一个你试图调整的特定查询,那么我们需要查询它本身和查询计划(使用粘贴计划)。如果更一般,那么我们需要了解表中经常查询的内容,或者运行的频繁查询。在这两种情况下,都需要具有当前索引的表的完整DDL。对于后者,您对系统的了解将难以轻松传达;你知道你的系统,它的使用比我们好得多,因此你应该知道索引中可能需要什么。听起来你已经有了一个覆盖索引,特别是最后三列有时才包括在内。除非您遇到性能问题,否则我不愿意添加更多索引。@TomGullen如果您的查询只选择几列,您可以在INCLUDE子句中添加这些列。在表(ArcadeID]ASC、[Published]ASC、[AccessMode]ASC)INCLUDE(其他列)上创建索引idx_xxx。这将节省昂贵的主键查找。这将使索引成为查询的覆盖索引。@seAnRange除非所有被选择的列都是索引列或包含子句中的列,否则该索引实际上不是覆盖索引。