Indexing SQL Server 2000索引-群集与非群集

Indexing SQL Server 2000索引-群集与非群集,indexing,sql-server-2000,clustered-index,Indexing,Sql Server 2000,Clustered Index,我继承了一个数据库,其中有聚集索引和每个聚集索引的附加重复索引 i、 e IX_PrimaryKey是列ID上的聚集索引。 IX_ID是列ID上的非聚集索引 我想清理这些重复的非聚集索引,我想检查一下是否有人能想出这样做的理由 有人能想到这样做会带来性能上的好处吗?对于完全相同的索引,没有性能上的好处。实际上,它在插入和更新时会导致性能损失。但是,如果存在具有不同列顺序的多列索引,则可能有一个合理的原因。对于完全相同的索引,没有性能增益。实际上,它在插入和更新时会导致性能损失。但是,如果有具有不

我继承了一个数据库,其中有聚集索引和每个聚集索引的附加重复索引

i、 e IX_PrimaryKey是列ID上的聚集索引。 IX_ID是列ID上的非聚集索引

我想清理这些重复的非聚集索引,我想检查一下是否有人能想出这样做的理由


有人能想到这样做会带来性能上的好处吗?

对于完全相同的索引,没有性能上的好处。实际上,它在插入和更新时会导致性能损失。但是,如果存在具有不同列顺序的多列索引,则可能有一个合理的原因。

对于完全相同的索引,没有性能增益。实际上,它在插入和更新时会导致性能损失。但是,如果有具有不同列顺序的多列索引,可能有一个合理的原因。

也许我没有认真思考,但我看不出有任何理由这样做;聚集索引的本质是按照索引的顺序组织数据。看来额外的索引完全是浪费


翻阅BOL并观察这个问题,虽然…

也许我思考得不够努力,但我看不出有任何理由这样做;聚集索引的本质是按照索引的顺序组织数据。看来额外的索引完全是浪费


通过BOL挖掘并观察这个问题,但是…

这样做似乎没有合理的理由,而且会影响性能

我能想到的唯一一件事就是创建一个行宽度非常窄的索引,这样每页的行数就非常高,使得扫描/查找速度非常快。但是,由于它不包含其他字段(除了相同值的聚集键),我仍然看不出它的原因


很有可能原始创建者没有意识到PK默认为聚集索引,并在没有意识到它是重复的情况下创建了NC索引。

这样做似乎没有合理的理由,而且性能受到了影响

我能想到的唯一一件事就是创建一个行宽度非常窄的索引,这样每页的行数就非常高,使得扫描/查找速度非常快。但是,由于它不包含其他字段(除了相同值的聚集键),我仍然看不出它的原因


很可能原始创建者没有意识到PK默认为聚集索引,并在没有意识到它是重复的情况下创建了NC索引。

我推测可能发生的情况是,在指定主键约束时,SQL Server会自动创建聚集索引(如果另一个索引(非聚集/聚集)不存在,则会发生这种情况),然后可能有人为主键列创建了非聚集索引

这种情况将:

  • 对性能有一些不利影响,因为在插入/删除/更新时会更新索引
  • 使用额外的磁盘空间
  • 可能会导致僵局
  • 将有助于在备份/恢复数据库方面花费更多时间

干杯

我想可能发生的情况是,当指定主键约束时,SQL Server会自动创建聚集索引(如果另一个索引(非聚集/聚集)不存在,则会发生这种情况),然后可能有人为主键列创建了非聚集索引

这种情况将:

  • 对性能有一些不利影响,因为在插入/删除/更新时会更新索引
  • 使用额外的磁盘空间
  • 可能会导致僵局
  • 将有助于在备份/恢复数据库方面花费更多时间

干杯

创建群集主键将是一种浪费。除非您有使用WHERE ID=10搜索记录的查询


您可能希望在列上创建聚集索引,该列将经常在WHERE City='Sydney'上查询。聚集意味着SQL将根据聚集索引对表中的数据进行分组。通过对表中的城市值进行分组,意味着SQL可以更快地搜索数据。

创建聚集主键将是一种浪费。Unless您有使用其中ID=10搜索记录的查询吗


您可能希望在列上创建聚集索引,该列将经常在WHERE City='Sydney'上查询。聚集意味着SQL将根据聚集索引对表中的数据进行分组。通过对表中的城市值进行分组,意味着SQL可以更快地搜索数据。

在同一数据上存储两个索引是对磁盘的浪费维护数据所需的空间和处理

然而,我可以想象一个产品依赖于名为
IX_PrimaryKey
的索引的存在

string queryPattern = "select * from {0} as t with (index(IX_PrimaryKey))";
您可以这样说,聚集索引本身占用的空间比其他索引少得多,因为叶是实际数据。另一方面,聚集索引更容易发生页面拆分,而某些索引最好是非聚集索引

综上所述,我可以肯定地想到删除重复索引是件坏事的场景:

  • 类似上面的代码,它依赖于一个已知的索引名
  • 可以将聚集索引更改为任何非聚集索引的代码
  • 使用存在/不存在IX_PrimaryKey以某种方式处理表的代码
我不认为任何这些好的设计,但我绝对可以想象有人在做这件事。(你把它寄给了DailyWTF吗?) 在某些情况下,有不相同的重叠索引是有意义的:

create index IX_1 on table1 (ID)
create index IX_2 on table1 (ID, TYPE, ORDER_DATE, TOTAL_CHARGES)
如果严格按照ID进行查找,则SQL ca