gpt4 book ai didi

sql-server - 每个用户表都应该有聚集索引吗?

转载 作者:行者123 更新时间:2023-12-01 23:06:23 27 4
gpt4 key购买 nike

最近我在数据库中发现了几个没有定义聚集索引的表。但定义了非聚集索引,因此它们位于 HEAP 上。

经过分析,我发现 select 语句对非聚集索引中定义的列使用过滤器。

这些表上没有聚集索引会影响性能吗?

最佳答案

很难比 SQL Server MVP Brad McGehee 更简洁地表述这一点。 :

As a rule of thumb, every table should have a clustered index. Generally, but not always, the clustered index should be on a column that monotonically increases–such as an identity column, or some other column where the value is increasing–and is unique. In many cases, the primary key is the ideal column for a clustered index.

BOL呼应了这种情绪:

With few exceptions, every table should have a clustered index.

这样做的原因有很多,主要基于以下事实:聚集索引对存储中的数据进行物理排序

  • 如果您的聚集索引位于单调递增的单个列上,则插入会按顺序在您的存储设备上进行,并且不会发生页面拆分。

  • 当索引值唯一时,聚集索引可以有效地查找特定行,例如基于主键选择行的常见模式。

  • 聚集索引 often允许对经常搜索值范围(Between> 等)的列进行高效查询。

  • 聚类可以加快数据通常按特定列排序的查询速度。

  • 可以根据需要重建或重组聚集索引以控制表碎片。

  • 这些好处甚至可以是applied to views .

您可能不希望在以下位置建立聚集索引:

  • 数据频繁更改的列,因为 SQL Server 必须对存储中的数据进行物理重新排序。

  • 已被其他索引覆盖的列。

  • 宽键,因为聚集索引也用于非聚集索引查找。

  • GUID 列,它比身份大,而且也是有效的随机值(不太可能进行排序),但 newsequentialid()可用于帮助减少插入期间的物理重新排序。

  • 使用 heap 的罕见原因(没有聚集索引的表)是指数据始终通过非聚集索引访问,并且已知 RID(SQL Server 内部行标识符)小于聚集索引键。

由于这些因素和其他考虑因素(例如您的特定应用程序工作负载),您应该仔细选择聚集索引,以获得查询的最大 yield 。

另请注意,当您在 SQL Server 中的表上创建主键时,默认情况下它将创建一个唯一的聚集索引(如果还没有)。这意味着,如果您发现一个表没有聚集索引,但有主键(所有表都应该如此),则开发人员之前已决定以这种方式创建它。您可能想要有一个令人信服的理由来改变这一点(正如我们所见,有很多理由)。 添加、更改或删除聚集索引需要重写整个表和任何非聚集索引,因此这在大型表上可能需要一些时间。

关于sql-server - 每个用户表都应该有聚集索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11787797/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com