Sql server 在不添加/删除聚集索引的情况下减少SQL Server表碎片?
我有一个大型数据库(90GB的数据,70GB的索引),在过去的一年中一直在缓慢增长,而且增长/更改不仅导致了索引的大量内部碎片,还导致了表本身的大量内部碎片 解决(大量)非常零碎的索引很容易——重组或重建将解决这一问题,具体取决于它们的零碎程度——但我能找到的清理实际表碎片的唯一建议是向表中添加聚集索引。之后我会立即删除它,因为我不想在表上继续使用聚集索引,但是有没有其他方法可以在没有聚集索引的情况下执行此操作?一个“DBCC”命令将执行此操作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”命令将执行此操作 感谢您的帮助。您声明添加了聚集索引以减轻表碎片,然
感谢您的帮助。您声明添加了聚集索引以减轻表碎片,然后立即删除它 聚集索引通过对集群键进行排序来删除碎片,但是您说这个键将来不可能使用。这就引出了一个问题:为什么要使用这个密钥进行碎片整理 创建并保留这个集群键是有意义的,因为您显然希望/需要以这种方式对数据进行排序。您说数据更改将导致无法承受的数据移动惩罚;您是否考虑过创建小于默认值的
FILLFACTOR
索引?根据数据更改模式,您可以从低至80%的数据中获益。然后,每页有20%的“未使用”空间,但更改聚集键值时,较低的页面分割会带来好处
这对你有帮助吗?问题
让我们澄清一下,因为这是一个常见的问题,对于每个使用SQL Server的公司来说都是一个严重的问题
这个问题以及创建聚集索引的需要被误解了
同意拥有永久聚集索引比没有更好。但这不是重点,无论如何,这将导致一个漫长的讨论,所以让我们把它放在一边,专注于发布的问题
关键是,堆上有大量碎片。您一直称它为“表”,但在物理数据存储或数据结构级别上没有这样的东西。表是一个逻辑概念,而不是物理概念。它是物理数据结构的集合。该系列是两种可能性之一:
- 堆
加上所有非聚集索引
加上文本/图像链 - 或聚集索引
(消除堆和一个非聚集索引)
加上所有非聚集索引
加上文本/图像链
虽然这并没有为我的问题提供一个神奇的解决方案,但它清楚地表明,我的问题是SQL Server限制的结果,添加聚集索引是对堆进行“碎片整理”的唯一方法 不完全是。我不会称之为“限制”
- 关系数据库中的每个表(除了“管道”或“队列”表)都应该有一个聚集索引,以利用其各种优点
- 聚集索引应该位于分布数据的列上(避免插入冲突),而决不能在单调递增的列上建立索引,例如记录ID 1,它保证在最后一页中插入热点
您是否可以进一步评论“注意,有三个碎片级别;这只涉及第三级”——其他两个碎片级别是什么 在MS SQL和Sybase ASE中,有三个级别的碎片,在每个级别中有几种不同的类型。请记住,在处理碎片时,我们必须关注数据结构,而不是表(表是数据结构的集合,如上所述)。这些级别是:
- 一级•额外数据结构 在相关数据结构之外,在