【问题标题】:Clustered index in SQL ServerSQL Server 中的聚集索引
【发布时间】:2014-12-21 22:59:23
【问题描述】:

我知道,当我们在 SQL Server 中使用其主键创建表时,会自动创建一个聚集索引。但是如果我从该表中删除一行,与该行相关的聚集索引是否仍保留在索引表中或自动删除?如果没有自动删除,是否必须创建作业来重建和重组索引? (mysql、oracle等也一样?)

【问题讨论】:

  • 当然聚簇索引(像任何其他索引一样)会不断更新。这就是为什么太多索引比没有索引更糟糕的原因!拥有一个索引总是也会带来维护它的负担!

标签: sql sql-server indexing clustered-index


【解决方案1】:

我知道当我们用它的主键在 sqlserver 中创建一个表时, 自动创建聚集索引。

仅当它是默认选项或 clustered 被指定为关键字时才适用。主键也可以是非聚集索引。

但是如果我从这个表中删除一行,聚集索引 与此行相关的仍保留在索引表中或它 自动删除?

如果真的是聚集索引,那么索引就是表数据。如果你从表中删除一些东西,它就消失了。有一些内部工作,例如幽灵记录,但是数据已经消失了(从应用程序的角度来看)。

如果不是自动删除,是不是要创建一个job 重建和重组索引?

确实,还有其他处理某些“隐藏”功能的后台任务。最终,当碎片(内部或外部)开始成为问题时,您将需要重新组织或重建索引。这将取决于其他变量,包括表结构、访问权限等。

(mysql、oracle等也一样?)

问题被标记为 SQL Server,所以我正在回答 SQL Server 标记。对于单个帖子来说,这是一个非常广泛的问题。

【讨论】:

    【解决方案2】:

    Oracle 或 MySQL 的默认值不同。每个数据库都有自己的默认值和特定的功能。有些人甚至使用相同的术语来表示不同的含义。

    Oracle 不默认使用聚集索引,而在 Oracle 中,等效的是索引组织表。在 Oracle 中,CLUSTER 的定义是一个可以存储 2 个或多个表并按相同顺序排列的结构。

    如果不是自动删除,是不是要创建一个job 重建和重组索引?

    重建索引的第一条规则 - 衡量、衡量、衡量。证明重建是有益的,否则不要费心再做一次,除非情况发生变化。

    简单的删除(或千次删除)并不是重建索引的自动原因。

    如果你要重建索引,你应该知道(1)前后有多少数据块(2)前后的访问次数。

    关于将索引重建作为一般做法存在很多错误信息和迷信。您所指的索引是 B-Tree 结构。这些设计为可扩展的 O(log N) 访问。没有证据表明默认情况下必须重新组织索引。每个指数都是它自己的动物。 B-tree 索引在使用一段时间后会达到一个停滞点(平衡),当你重建它们时,你会压缩它们(一件好事),但它们最终会回到那个停滞点。除非我发现其中一个的性能/ IO 问题,否则我将根据具体情况手动进行。

    重建的两大好处:

    1. 更密集地将数据打包成更少的块,从而提高缓存和 IO。
    2. 根据累积的实际数据对非聚集索引重新排序。如果您的访问模式始终是顺序的(包括插入),那么这通常不是问题,块将被排序。

    Oracle 和 SQL Server 是很棒的技术。在没有证据的情况下重建索引对于专业的 DBA 来说是没有好处的。

    【讨论】:

    • 要明确一点,重建的目的始终是1.More densely packs the data into less blocks, which improves cache and IO. 您可能会为插入等腾出空间,这取决于您选择聚集索引的方式,这样页面拆分就不会成为问题。这实际上与所描述的相反。我不是挑剔,只是指出我实际遇到的用例。
    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 2012-10-01
    • 2012-02-02
    • 1970-01-01
    • 2015-06-14
    • 2011-03-13
    • 2010-11-23
    相关资源
    最近更新 更多