如果我有一个聚集的单列索引,例如FooId
在 SQL Server 2008、2012 中,我知道我已经弄乱了行的顺序,不再有FooId
列的顺序,应该使用哪个命令:
- 更新统计数据
- 重建
- 改组
编辑
场景
FooId
是序列唯一标识符类型的集群 pk,但为了简单起见,本文我们使用 #1 作为 id 值。
#1 inserted
#2 inserted
#3 inserted
#1 selected
#1 deleted
#2 selected
#2 deleted
#2 inserted
(即重复使用#1 的集群 PK)
#1 inserted
(即重复使用#1 的集群 PK)
这不是要打破先后顺序吗?现在会不会这样存储:
#3
#2
#1
//丹尼尔
您可能误解了聚簇索引的工作方式——根据定义,数据在逻辑上按照聚簇键的顺序排序,尽管聚簇索引在插入新数据时可能会在物理上变得碎片化,因为页面拆分会发生。
如果要减少碎片要么
REBUILD
或者REORGANIZE
都可以。经验法则是当碎片低于 5% 时什么都不做,REORGANIZE
当碎片在 5% 到 30% 之间,REBUILD
当碎片高于 30% 时。索引碎片记录在 DMV sys.dm_db_index_physical_stats中。另请参阅MSDN 页面
REBUILD/REORGANIZE
值得注意的是,除非您运行的是 SQL Server 企业版,
REBUILD
否则无法联机执行 - 这意味着您的表在命令执行期间将无法访问。REORGANIZE
始终在线进行。