【发布时间】:2011-03-21 04:46:11
【问题描述】:
我有一个大型数据库(90GB 数据,70GB 索引),在过去的一年里一直在缓慢增长,增长/变化不仅导致了索引的大量内部碎片,还导致了表本身的大量内部碎片。
解决(大量)非常碎片化的索引很容易 - REORGANIZE 或 REBUILD 会处理这个问题,具体取决于它们的碎片化程度 - 但我能找到的关于清理实际表碎片的唯一建议是添加表的聚集索引。之后我会立即删除它,因为我不希望表上的聚集索引继续前进,但是没有聚集索引还有另一种方法吗?执行此操作的“DBCC”命令?
感谢您的帮助。
【问题讨论】:
-
你为什么不想要一个聚集索引?
-
仅添加一个“ID”标识 bigint 列作为聚集索引不仅可以解决您的碎片问题,还可能会使您的所有其他索引更小。
-
您是否进行了测试以确认聚集索引会严重影响性能?顺便说一句,聚集索引不必位于主键上。
-
@RobinDay。索引是必需的,至少需要一个来提供行唯一性(与记录 ID 唯一性相反)。因此不能删除索引,也不能实现数据库收缩。将 PK 更改为 ID,然后将其迁移到所有子表将减小大小,但这是不可行的,因为失去了关系完整性和 JOIN 能力。更不用说,根据给出的原因,OP 不能。
-
@user4154343。 创建聚集索引然后将其删除以减少堆中的碎片是一个坏主意 是错误的且具有误导性。 Randall 特别建议创建一个聚集索引并将其永久保留。
标签: sql-server sql-server-2005 fragmentation dbcc database-fragmentation