我认为我对SQL Server2005中的索引(可能是所有索引??)是有缺陷的,请教教我。
我们有一个表,假设有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和PriceId上添加另一个索引
CREATE INDEX "ProductAndOrderIndex" ON "dummy_table" (
"ProductId",
"OrderId",
"PriceId"
)第一个索引是否冗余,即SQL Server规划器应恢复使用第二个索引,并且性能同样良好?
出现这个问题的原因是,删除第一个索引会导致性能大幅下降(一个进程的10秒变成了2分半钟)。我已经将它缩小到特定的索引,所以下一件事是跟踪所有的SQL,但这将是一个很大的任务,除非迫不得已,否则我不想做。
发布于 2013-04-20 01:17:33
在ProductId上没有索引的情况下,查询优化器可能会使用ProductId、OrderId和PriceId上的索引。任一索引每页包含的条目都多于表行,因此它们减少了所需的I/O。
与第二个索引相比,第一个索引每页包含的条目更多,而ProductId上的重复项更少。这使得ProductId的查找效率更高。如果查询使用OrderId和/或PriceId,即使它们只是输出列,查询优化器仍然会发现第二个索引更有效。(请参阅covered index。)
查看查询的执行计划。它将显示如何使用索引以及执行的I/O操作的数量。这应该会解开大部分的谜团。
https://stackoverflow.com/questions/16109736
复制相似问题