【发布时间】: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