包括索引:[(a)包括(b,c,d)]或[(a,b)include(c,d)]



我有一个像so:

的查询
SELECT BookID
FROM Books
WHERE IsArchived = 1 AND Rating > 60 AND CategoryID IN (1, 2, 3)

当我在SQL Server 2012中执行它时,执行计划结果告诉我

缺少索引:...

在书籍上创建非集群索引(nocard,评级)包括(bookid,categoryid)

我的问题是,我应该创建索引:

(IsArchived) INCLUDE (Rating, BookID, CategoryID)

(IsArchived, Rating) INCLUDE (BookID, CategoryID)根据给定的提示

imo,由于限制列订单,第二种方法的灵活性较小([Rating]遵循[IsArchived])。任何建议都将不胜感激!

=================

我假设订购的列的影响级别:

[1: IsArchived]> [2: Rating]>[3: CategoryID]

因此,[1 inlcude 2,3] vs [1,2 include 3] vs [1,2,3]

在设计索引时,在您的b_tree中。您应该拥有连接的主要级别,在该条款和顺序中。然后包括您的选择语句。

另外,只有在查找查找时,您就不需要包含该书籍。但这一切都取决于您在服务器上的执行计划和数据量。

(natharchived),(等级),(categoryId)include(bookid)

这些类型的索引调谐更多是一种艺术形式,而不是具有确切的答案。

我这样看的方式是,您实际上是根据三列

搜索数据
  1. 否则
  2. 评级
  3. 类别

然后您在选择语句中使用一个字段;

  • bookid

从中,您知道您肯定会在其中需要BookID,但是对于其他三个领域,您需要确定最适合您的事情。

这些领域中的哪个将帮助您最多减少数据?假设您有1,000,000行数据,其中有多少人具有IsArchived = 1Rating > 60有多少个(此字段是INT?)?有多少个CategoryID IN (1,2,3)

对于这三个,您希望尽快减少数据。考虑哪些将对您的数据量产生最大的影响,并首先使用此量。然后是下一个最相关的,然后是最后一个。

当您进一步进入群集字段时,该订单的影响将较小,因此您绝对希望该领域具有最大的影响。

编辑:

根据您的编辑,只有您知道哪些数据是最好的数据。作为没有这些信息的某人,我可能会选择

INDEX (1,2,3) INCLUDE (BookID)

这将为您提供最多的数据,以此特定查询。如果您正在测试,更新统计信息,则可以始终实现一对夫妇,然后测试最好的示例。优化器将使用最佳的一个,您可以检查actual execution plan以查看其使用的索引。

最新更新