【问题标题】:Duplicate UniqueIdentifier Indexes重复的唯一标识符索引
【发布时间】:2013-04-13 03:34:21
【问题描述】:

我认为我对 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 OrderId AND PriceId 上添加另一个索引

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

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

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

【问题讨论】:

  • 你为什么使用"identifiers" 让你的"tables""columns""indexes" 看起来像字符串文字?这里不需要它们,但恕我直言,在必要时使用[square brackets] 更具可读性。
  • 我的错...我会把那些改成 Guids
  • @AaronBertrand:ANSI 对象分隔符是",所以没有错。但是,我不得不说,我只使用[](必要时)。
  • @Martin:就这两个索引使用的空间而言,如果所有%Id列都是UNIQUEIDENTIFIERs,如果这个表有一个唯一的聚集索引(Id),如果这个表有 3000 万行,那么差异是 aprox。 926 MB(不是 Mb)。
  • @Bogdan 我没有说这是“错误的”——只是可读性较差。

标签: sql-server-2005 database-indexes


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多