是否有充分的理由用唯一的非聚集索引替换聚簇索引

时间:2014-10-22 16:19:03

标签: sql sql-server database-administration

我正在清理数据库,并且存在流量大的性能问题。读写。但是,交通繁忙每年都会缩短几天。

我怀疑一个问题是很多使用频繁的表没有聚集索引。但是它们确实有一个主键和一个独特的非聚集索引,它只是在主键上(没有包含)。

这是一种有益的方法吗?

我的猜测是有人认为如果db不必插入聚集索引中的所有列会更快(我不会自己这样做,所以我不知道方法背后的疯狂)。

我开始将聚簇索引应用于这些表,但是在我走得太远之前想要调查聪明的头脑,看看是否存在这样的策略有帮助的场景?

我认为丢失与聚集索引的连接会超过这可能带来的任何收益?

3 个答案:

答案 0 :(得分:2)

我非常有信心说不,这不是一种有益的方法。如果一个表只有非聚簇索引,那么它就是一个堆表,除了批量插入操作之外,没有充分的理由拥有堆表。那不仅仅是我说话,那是Microsoft's opinion as well

我维护了一个大仓库,最好根本没有主键(因为它的索引在没有使用的情况下占用了大量空间),但只有一个唯一的聚簇索引{ {1}}加上DATETIME。但你会注意到,主键或不是,它确实有一个聚集索引,因为没有一个只是一个坏主意。

答案 1 :(得分:1)

没有。如果您有候选键,则将其用作聚簇索引。唯一的非聚集索引可用于关键查找并保证唯一性。将使用聚集索引,此外还可以使用范围扫描和排序保证。

当繁忙的流量缩短到几天时,这表示时间序列,其中查询要求最近的范围:总计和今天的其他汇总,最后一天,上周等。按时间排列表使所有这些查询工作,无需扫描整个表,结束端。

主键不必与聚簇索引匹配。主键是一个逻辑概念,对于建模数据和在主/外键关系中强制引用完整性很有用(严格来说,外键可以引用任何列,但大多数情况下它引用主键)。

聚集索引将定义物理布局,由大多数常见查询的实际考虑因素,存在的范围扫描类型以及密钥大小权衡进行驱动。

添加聚簇索引可能会改变某些访问模式,并可能引入新的死锁可能性,但坦率地说,这种可能性很小。通常删除一个增加了死锁的聚簇索引,而不是添加死锁。

最后,我不会过分担心插入/更新费用。大多数应用程序具有压倒性的读写比率,并且具有更快的读取速度,使应用程序感觉响应更快,而且更加快速。此外,读取改进使得可用索引显示为x100s次改进(小范围扫描与表端到端扫描),而写入降级表现为分数增加(例如写入时间增加10-15%),通常不明显应用程序。

答案 2 :(得分:0)

如果没有聚集索引,但是通过使用主键,插入速度会快得多,但仍然存在唯一性。因此,虽然标准堆需要查询来搜索每个记录以找到所需的记录,但是具有非群集主键的堆将在找到第一个结果后停止。虽然这仍然很慢,但速度比什么都快,如果你对1个查询进行1M插入,那么非常值得。

日志表是有用的主要示例。