重复的UniqueIdentifier索引

时间:2013-04-19 16:53:00

标签: sql-server-2005 database-indexes

我认为我对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"
)

然后在ProductIdOrderId AND PriceId

上添加另一个索引
CREATE INDEX "ProductAndOrderIndex" ON "dummy_table" (
   "ProductId",
   "OrderId",
   "PriceId"
)

第一个索引是多余的,即SQL Server规划器应该恢复使用第二个索引并且性能如何?

这个问题的出现是因为删除第一个索引会导致性能大幅下降(一个过程需要10秒才能达到2分半钟)。我把它缩小到那个特定的索引,所以下一步就是跟踪所有的SQL,但这将是一个我不想做的大任务,除非我不得不这样做。

1 个答案:

答案 0 :(得分:1)

如果ProductId上没有索引,查询优化器可能会使用ProductIdOrderIdPriceId上的索引。每个索引每页都包含比表行更多的条目,因此它们会减少所需的I / O.

第一个索引每页包含更多条目,ProductId上的重复项比第二个索引少。这使ProductId的查找效率更高。如果查询使用OrderId和/或PriceId,即使它们只是输出列,查询优化器仍可能会发现第二个索引更有效。 (见covered index。)

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