【发布时间】:2012-01-18 03:09:56
【问题描述】:
我们有一个简单的表格,如下所示:
OrderID primary key / clustered index
CustomerID foreign key / single-column non-clustered index
[a bunch more columns]
然后,我们有一个这样的查询:
SELECT [a bunch of columns]
FROM Orders
WHERE CustomerID = 1234
我们发现有时 SQL Server 2008 R2 会在非聚集索引上进行查找,然后在聚集索引上进行书签查找(我们喜欢这样 - 它非常快)。
但在其他看似随机的情况下,SQL Server 反而对聚集索引进行扫描(非常慢 - 让我们的应用陷入爬行状态 - 而且它似乎在我们一天中最繁忙的时间执行此操作)。
我知道我们可以 (a) 使用索引提示,或者 (b) 增强我们的非聚集索引,以便它覆盖我们选择的大量列。但是 (a) 将逻辑与物理联系起来,关于 (b),我读到索引不应涵盖太多列。
我首先很想听听为什么 SQL Server 正在做它正在做的事情的任何想法。此外,任何建议将不胜感激。谢谢!
【问题讨论】:
-
这些随机场合是否也使用单个
CustomerID进行查询,还是一次查询多行?书签查找是一项非常昂贵的操作,因此扫描速度更快的临界点非常低 - 远低于大多数人的预期 -
谢谢大家。您帮助我意识到我们的问题可能是许多订单可以为单个客户返回 - 使查询非选择性。
-
所以我想我们将创建一个覆盖索引 - 覆盖返回的 12 个左右的字段。然而(对我来说)这样做的一个缺点是我们可能会在查询中添加一个字段,而忘记扩展覆盖索引。我想我们需要用勿忘我来评论我们的查询。 :)
标签: sql-server sql-server-2008-r2