我有一个像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)
这些类型的索引调谐更多是一种艺术形式,而不是具有确切的答案。
我这样看的方式是,您实际上是根据三列
搜索数据- 否则
- 评级
- 类别
然后您在选择语句中使用一个字段;
- bookid
从中,您知道您肯定会在其中需要BookID
,但是对于其他三个领域,您需要确定最适合您的事情。
这些领域中的哪个将帮助您最多减少数据?假设您有1,000,000行数据,其中有多少人具有IsArchived = 1
?Rating > 60
有多少个(此字段是INT?)?有多少个CategoryID IN (1,2,3)
?
对于这三个,您希望尽快减少数据。考虑哪些将对您的数据量产生最大的影响,并首先使用此量。然后是下一个最相关的,然后是最后一个。
当您进一步进入群集字段时,该订单的影响将较小,因此您绝对希望该领域具有最大的影响。
编辑:
根据您的编辑,只有您知道哪些数据是最好的数据。作为没有这些信息的某人,我可能会选择
INDEX (1,2,3) INCLUDE (BookID)
这将为您提供最多的数据,以此特定查询。如果您正在测试,更新统计信息,则可以始终实现一对夫妇,然后测试最好的示例。优化器将使用最佳的一个,您可以检查actual execution plan
以查看其使用的索引。