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

2023-12-29

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

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

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


很难比 SQL Server MVP 更简洁地表述这一点布拉德·麦吉 https://www.sql-server-performance.com/author/bradmcgehee/:

根据经验,每个表都应该有一个聚集索引。 https://www.sql-server-performance.com/clustered-indexes/一般来说,但并非总是如此,聚集索引应该位于单调增加的列上(例如标识列或值不断增加的其他列)并且是唯一的。在许多情况下,主键是聚集索引的理想列。

BOL https://msdn.microsoft.com/en-us/library/ms186342.aspx呼应了这种情绪:

除了少数例外,每个表都应该有一个聚集索引。

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

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

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

  • 聚集索引often https://www.sqlinthewild.co.za/index.php/2011/02/01/is-a-clustered-index-best-for-range-queries/允许对经常搜索值范围的列进行高效查询(between, >, etc.).

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

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

  • 这些好处甚至可以应用于视图 https://msdn.microsoft.com/en-us/library/ms191432.aspx.

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

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

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

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

  • GUID 列,比身份大,也是有效的随机值(不太可能进行排序)newsequentialid() https://msdn.microsoft.com/en-us/library/ms189786.aspx可用于帮助减少插入期间的物理重新排序。

  • 使用的罕见原因heap https://msdn.microsoft.com/en-us/library/hh213609(没有聚集索引的表)是指数据始终通过非聚集索引访问,并且 RID(SQL Server 内部行标识符)已知小于聚集索引键。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个用户表都应该有聚集索引吗? 的相关文章

随机推荐

  • 优先级队列数据结构

    假设我有一个优先级队列 它按升序删除元素 并且存储在该队列中的是元素1 1 3 0 1 递增的顺序是0 then 1 then 3 但是有三个元素1s 当我打电话时remove它会首先删除0 但如果我打电话remove它会再次删除所有三个吗
  • 提高功能性能

    我正在编写一个小程序来检查以下问题的解决方案布罗卡的问题 http en wikipedia org wiki Brocard s problem或所谓的棕色数字我首先用 ruby 创建了一个草稿 class Integer def fac
  • 在 Xcode 中创建和编辑 plist 文件的步骤

    我想添加密钥对值plist 我不知道如何在 XCode 中添加 plist 文件 只是我想将这些详细信息添加到名为 的 plist 文件中 Mobile plist Apple iPhone iPod iPad Samsung Galaxy
  • Java 中可以使用 C# 风格的对象初始化吗?

    在 C 中可以这样写 MyClass obj new MyClass field1 hello field2 world field3 new MyOtherClass etc 我可以看到数组初始化可以用类似的方式完成 但是在 Java 中
  • Tensorflow、Keras:在多类分类中,准确率很高,但大多数类别的精度、召回率和 f1 分数为零

    一般说明 我的代码工作正常 但结果是有线的 我不知道问题出在 网络结构 或者我向网络提供数据的方式 或其他任何东西 我为这个错误苦苦挣扎了几个星期 到目前为止我已经改变了损失函数 优化器 数据生成器等 但我无法解决它 我很感激任何帮助 如果
  • java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)”

    运行我的项目时出现错误 java lang RuntimeException Unable to start activity ComponentInfo com example olympic com prima olympic Prod
  • 为什么赋值的值总是参数的值? [复制]

    这个问题在这里已经有答案了 有人愿意解释一下为什么在旧版本的Ruby中 赋值的结果是属性设置方法返回的值 但是在Ruby 1 8之后 赋值的值总是参数的值 该方法的返回值被丢弃 在下面的代码中 旧版本的 Ruby 会将结果设置为 99 现在
  • 在进行另一次检查之前如何检查变量不为空?

    我有这个代码 if App selectedPhrases null App selectedPhrases Count 0 有没有办法可以使用 来简化它 运算符检查 null 而不是使用 连接进行两个不同的检查 您可以使用 null 条件
  • 使用 Hibernate 将两个或多个应用程序连接到同一个数据库

    我计划构建一个桌面应用程序 它将使用 Hibernate 和 MySQL 作为其数据源 我想在多台机器上执行桌面应用程序 但我希望它们都读 写同一个 MySQL 数据库 这可能吗 我担心的是当两个应用程序尝试访问 修改相同信息时的并发问题
  • 如果我没有足够的内存,spark 会做什么?

    我是 Spark 新手 我发现文档说 Spark 会将数据加载到内存中以使迭代算法更快 但是如果我有 10GB 的日志文件而只有 2GB 内存怎么办 Spark 会像往常一样将日志文件加载到内存中吗 我认为这个问题在 Spark 网站的 F
  • 使用 Graphql 时填充猫鼬模式中的“Ref”

    我正在使用 Graphql 然后遇到需要填充的情况 但我不知道如何执行它 这是我的预订架构 const mongoose require mongoose const Schema mongoose Schema const booking
  • 如何从 github 安装一个 fork 作为依赖项?

    我已经创建了某个存储库的分支 我需要使用该分支作为我的项目的依赖项 现在我这样做 npm install angular save 如何更改此设置以安装分叉 来自安装命令的 NPM 文档 https docs npmjs com cli i
  • PHP + Javascript - 读/写 Cookie

    是否可以使用 javascript 创建 cookie 然后使用 PHP 读取它 那么反过来呢 是的 您可以在任何一方设置和读取 cookie 在 javascript 方面 您需要解析document cookie变量 但是有很多库可以做
  • 使用 jquery 更改链接中的 html 文本

    这里有一个简单的问题 有没有办法更改文本 单击此处 a href nothing click here a 在这个链接中 Richard 你必须使用jquery的text 函数 https api jquery com text text
  • 应为使用 GetDIBits 函数从 HBITMAP 接收的 DIB 数据分配多少内存?

    应为使用 GetDIBits 函数从 HBITMAP 接收的 DIB 数据分配多少内存 MSDN中对GetDIBits函数的描述如下 int GetDIBits in HDC hdc in HBITMAP hbmp in UINT uSta
  • 如何使用 jQuery 选择文本节点?

    我想获取一个元素的所有后代文本节点 作为 jQuery 集合 最好的方法是什么 jQuery 没有为此提供方便的函数 你需要结合contents 它将只给出子节点 但包括文本节点 其中find 它给出所有后代元素 但不给出文本节点 这是我想
  • $(document).keydown 不起作用

    Edit 感谢大家的帮助 但我将我的问题跟踪为代替 请投票关闭 知道为什么吗 function document keydown function evt alert Hello 不管用 我在用Firefox 3 6 13在 Ubuntu
  • 什么时候需要 pygame.init() ?

    我正在学习 pygame 在绝大多数教程中据说应该运行pygame init 在做任何事情之前 我正在做一个特定的教程并像一个人那样输入代码 并注意到在一个又一个的示例中没有pygame init 并且没有任何模块的其他显式初始化 例如 以
  • 使用角度过滤来过滤角度材料表中的特定列?

    我在用垫子表 https run stackblitz com api angular v1 file app 2Ftable filtering example ts 它有一个过滤器 工作正常 针对以下数据进行过滤 所有列 const E
  • 每个用户表都应该有聚集索引吗?

    最近 我在数据库中发现了几个没有定义聚集索引的表 但定义了非聚集索引 因此它们位于 HEAP 上 经过分析 我发现 select 语句对非聚集索引中定义的列使用过滤器 这些表上没有聚集索引会影响性能吗 很难比 SQL Server MVP