emo*_*ore 4 sql-server clustered-index index-tuning sql-server-2012
我们有一个 COTS 产品,它创建了一个非常大的事务日志表。它有一个单一的聚集索引,支持声明为键的 IDENTITY 列。昨晚重建了索引,服务器磁盘空间不足,所以我从上午 12:30 开始工作。
现在我想知道 SQL Server 在重建此索引时是否会执行任何操作?没有叶子页面或页面拆分,因为所有插入都进入最后一页。我们从不删除行(无论如何还没有)。
显然服务器试图做某事,但如果它成功了,桌子会有什么不同吗?我认为这只是一个巨大的空操作和浪费时间。显然,如果表也具有非聚集索引,则情况并非如此。实际上,如果这个表确实有额外的索引,它仍然不需要先重建主索引,如果像我们的表一样,它只是添加,对吗?
我的 DBA 说他在数据库级别而不是在表级别管理所有索引。
附加信息
我的假设是重建后磁盘上的页面看起来和以前一样,我们只是在浪费时间进行数据库改组。
由于您不删除行,因此重建索引除了更新所述索引的统计信息之外不会提供任何实际价值,因为它们是通过重建操作隐式更新的。一种更有效的方法是只运行一条UPDATE STATISTICS
语句。
重建索引,例如使用 ALTER INDEX ... REBUILD,也将使用 WITH FULLSCAN 更新索引统计信息。
回答您的其他问题:
桌子会有什么不同吗?
除了位于不同的页面地址之外,不,在结构上它可能没有什么不同。
显然,如果表也具有非聚集索引,则情况并非如此。
重建聚集索引不会自动重建与表关联的任何非聚集索引。为此,您需要指定关键字ALL
而不是聚集索引名称。每MS :
...
ALTER INDEX…REBUILD
默认情况下,用于重建聚簇索引不会重建其非聚簇索引...您必须为索引名称指定 ALL 以重建所有索引。
最后一个问题:
如果这个表确实有额外的索引,它仍然不需要先重建主索引,如果像我们的表一样,它只是添加,对吗?
正确的。如果您在将记录添加到表的末尾后从不修改记录,那么您实际上只需要更新统计信息以避免出现如下 Scott Hodgin 的评论所指出的升序键问题。