Sql server 在不添加/删除聚集索引的情况下减少SQL Server表碎片?

Sql server 在不添加/删除聚集索引的情况下减少SQL Server表碎片?,sql-server,sql-server-2005,fragmentation,dbcc,database-fragmentation,Sql Server,Sql Server 2005,Fragmentation,Dbcc,Database Fragmentation,我有一个大型数据库(90GB的数据,70GB的索引),在过去的一年中一直在缓慢增长,而且增长/更改不仅导致了索引的大量内部碎片,还导致了表本身的大量内部碎片 解决(大量)非常零碎的索引很容易——重组或重建将解决这一问题,具体取决于它们的零碎程度——但我能找到的清理实际表碎片的唯一建议是向表中添加聚集索引。之后我会立即删除它,因为我不想在表上继续使用聚集索引,但是有没有其他方法可以在没有聚集索引的情况下执行此操作?一个“DBCC”命令将执行此操作 感谢您的帮助。您声明添加了聚集索引以减轻表碎片,然

我有一个大型数据库(90GB的数据,70GB的索引),在过去的一年中一直在缓慢增长,而且增长/更改不仅导致了索引的大量内部碎片,还导致了表本身的大量内部碎片

解决(大量)非常零碎的索引很容易——重组或重建将解决这一问题,具体取决于它们的零碎程度——但我能找到的清理实际表碎片的唯一建议是向表中添加聚集索引。之后我会立即删除它,因为我不想在表上继续使用聚集索引,但是有没有其他方法可以在没有聚集索引的情况下执行此操作?一个“DBCC”命令将执行此操作


感谢您的帮助。

您声明添加了聚集索引以减轻表碎片,然后立即删除它

聚集索引通过对集群键进行排序来删除碎片,但是您说这个键将来不可能使用。这就引出了一个问题:为什么要使用这个密钥进行碎片整理

创建并保留这个集群键是有意义的,因为您显然希望/需要以这种方式对数据进行排序。您说数据更改将导致无法承受的数据移动惩罚;您是否考虑过创建小于默认值的
FILLFACTOR
索引?根据数据更改模式,您可以从低至80%的数据中获益。然后,每页有20%的“未使用”空间,但更改聚集键值时,较低的页面分割会带来好处

这对你有帮助吗?

问题 让我们澄清一下,因为这是一个常见的问题,对于每个使用SQL Server的公司来说都是一个严重的问题

这个问题以及创建聚集索引的需要被误解了

同意拥有永久聚集索引比没有更好。但这不是重点,无论如何,这将导致一个漫长的讨论,所以让我们把它放在一边,专注于发布的问题

关键是,堆上有大量碎片。您一直称它为“表”,但在物理数据存储或数据结构级别上没有这样的东西。表是一个逻辑概念,而不是物理概念。它是物理数据结构的集合。该系列是两种可能性之一:


  • 加上所有非聚集索引
    加上文本/图像链

  • 聚集索引
    (消除堆和一个非聚集索引)
    加上所有非聚集索引
    加上文本/图像链

堆变得非常分散;分散(随机)的插入/删除/更新越多,碎片就越多

没有办法按原样清理堆。MS不提供设施(其他供应商提供)

解决方案 但是,我们知道Create Clustered Index完全重写和重新排序堆。因此,方法(不是技巧)是创建聚集索引,仅用于对堆进行碎片化处理,然后将其删除。您需要表_大小x 1.25的数据库中的可用空间

在您进行此操作时,务必使用FILLFACTOR,以减少将来的碎片。然后,堆将占用更多分配的空间,允许将来由于更新而进行插入、删除和行扩展

  • 请注意,碎片有三个级别;这只处理堆内的III级碎片,这是由于缺少聚集索引造成的

  • 作为一项单独的任务,在其他时间,您可能希望考虑实现一个永久聚集索引,它可以完全消除碎片。。。但这与问题无关

  • 对评论的回应 SqlRyan:

    虽然这并没有为我的问题提供一个神奇的解决方案,但它清楚地表明,我的问题是SQL Server限制的结果,添加聚集索引是对堆进行“碎片整理”的唯一方法

    不完全是。我不会称之为“限制”

  • 我给出的消除堆中碎片的方法是创建一个聚集索引,然后删除它。即,暂时,其唯一目的是纠正碎片

  • 在表上(永久地)实现聚集索引是一个更好的解决方案,因为它减少了总体碎片(数据结构仍然可以碎片化,请参阅下面链接中的详细信息),这远远小于堆中发生的碎片

    • 关系数据库中的每个表(除了“管道”或“队列”表)都应该有一个聚集索引,以利用其各种优点

    • 聚集索引应该位于分布数据的列上(避免插入冲突),而决不能在单调递增的列上建立索引,例如记录ID 1,它保证在最后一页中插入热点

  • 一,。每个文件上的记录ID使“数据库”成为一个非关系型的记录归档系统,使用SQL只是为了方便。这些文件没有关系数据库的完整性、功能或速度

    安德鲁·希尔:

    您是否可以进一步评论“注意,有三个碎片级别;这只涉及第三级”——其他两个碎片级别是什么

    在MS SQL和Sybase ASE中,有三个级别的碎片,在每个级别中有几种不同的类型。请记住,在处理碎片时,我们必须关注数据结构,而不是表(表是数据结构的集合,如上所述)。这些级别是:

    • 一级•额外数据结构 在相关数据结构之外,在