0

我认为我对 SQL Server 2005 中的索引(可能还有所有索引??)的理解是有缺陷的,请教育我。

我们有一个表,说 5 列:

Id  |  ProductId | OrderId | PriceId | Approved | Price
---------------------------------------------------------
1   |  2545      | 32345   | 224     |      1   |  150.00

该表有 3000 万行(如果重要的话,实际表中实际上大约有 30 列)。

这些Id列都是UniqueIdentifer,所以围绕如果其中一个是一个大字段,它可能不是多余的事实的帖子似乎并不相关。

如果我在列上添加索引ProductID

CREATE INDEX "ProductIndex" ON "dummy_table" (
   "ProductId"
)

ProductId然后在AND OrderIdAND上添加另一个索引PriceId

CREATE INDEX "ProductAndOrderIndex" ON "dummy_table" (
   "ProductId",
   "OrderId",
   "PriceId"
)

第一个索引是多余的吗,即 SQL Server 计划程序应该恢复使用第二个索引并且性能也一样好?

之所以出现这个问题,是因为删除第一个索引会导致性能大幅下降(一个进程的 10 秒已变为 2 分半钟)。我已经把它缩小到那个特定的索引,所以接下来就是跟踪所有的 SQL,但这将是一项大任务,除非我必须这样做,否则我不想做。

4

1 回答 1

1

在没有索引的情况下,ProductId查询优化器很可能会使用ProductId,OrderId和上的索引PriceId。任一索引每页包含比表行更多的条目,因此它们减少了所需的 I/O。

ProductId第一个索引将包含比第二个索引更多的每页条目和更少的重复项。这使得通过ProductId. 如果查询使用OrderId和/或PriceId,即使它们只是输出列,那么查询优化器仍可能会发现第二个索引更有效。(参见涵盖的索引。)

查看查询的执行计划。它将显示如何使用索引以及执行的 I/O 操作的数量。这应该可以解开大部分谜团。

于 2013-04-19T17:17:33.470 回答