我认为我对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
和OrderId
AND PriceId
CREATE INDEX "ProductAndOrderIndex" ON "dummy_table" (
"ProductId",
"OrderId",
"PriceId"
)
第一个索引是多余的,即SQL Server规划器应该恢复使用第二个索引并且性能如何?
这个问题的出现是因为删除第一个索引会导致性能大幅下降(一个过程需要10秒才能达到2分半钟)。我把它缩小到那个特定的索引,所以下一步就是跟踪所有的SQL,但这将是一个我不想做的大任务,除非我不得不这样做。
答案 0 :(得分:1)
如果ProductId
上没有索引,查询优化器可能会使用ProductId
,OrderId
和PriceId
上的索引。每个索引每页都包含比表行更多的条目,因此它们会减少所需的I / O.
第一个索引每页包含更多条目,ProductId
上的重复项比第二个索引少。这使ProductId
的查找效率更高。如果查询使用OrderId
和/或PriceId
,即使它们只是输出列,查询优化器仍可能会发现第二个索引更有效。 (见covered index。)
查看查询的执行计划。它将显示如何使用索引以及执行的I / O操作数。这应该清除大部分的谜团。