首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复的UniqueIdentifier索引

重复的UniqueIdentifier索引
EN

Stack Overflow用户
提问于 2013-04-20 00:53:00
回答 1查看 54关注 0票数 0

我认为我对SQL Server2005中的索引(可能是所有索引??)是有缺陷的,请教教我。

我们有一个表,假设有5列:

代码语言:javascript
复制
Id  |  ProductId | OrderId | PriceId | Approved | Price
---------------------------------------------------------
1   |  2545      | 32345   | 224     |      1   |  150.00

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

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

如果我在列ProductID上添加一个索引。

代码语言:javascript
复制
CREATE INDEX "ProductIndex" ON "dummy_table" (
   "ProductId"
)

然后在ProductIdOrderIdPriceId上添加另一个索引

代码语言:javascript
复制
CREATE INDEX "ProductAndOrderIndex" ON "dummy_table" (
   "ProductId",
   "OrderId",
   "PriceId"
)

第一个索引是否冗余,即SQL Server规划器应恢复使用第二个索引,并且性能同样良好?

出现这个问题的原因是,删除第一个索引会导致性能大幅下降(一个进程的10秒变成了2分半钟)。我已经将它缩小到特定的索引,所以下一件事是跟踪所有的SQL,但这将是一个很大的任务,除非迫不得已,否则我不想做。

EN

回答 1

Stack Overflow用户

发布于 2013-04-20 01:17:33

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16109736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档