SQL Server 重新索引需要多长时间?

SQL Server 重新索引需要多长时间?

我最近接手了一个非常大且非常混乱的数据库,需要清理一下。为了便于理解,主数据库目前包含 3 个大表,每个表约有 3 亿行,占用约 225GB 的存储空间。每天新增超过 500 万行。

由于磁盘空间严重不足(前任没有归档旧数据或根本没有管理其大小),我被迫从最大的表中删除了大约 2.8 亿行。这个过程花了 25 个小时才完成,在此期间,数据库需要与面向客户的应用程序断开连接。

现在,我需要重新索引该表,因为选择和插入需要很长时间。但是,我不能无限期地将数据库脱机,我需要能够估计执行重新索引所需的时间。我以前从未重新索引过如此大的表,所以我真的没有任何好的参考点可以借鉴。

主表包括一个聚集的、单调递增的主键,以及一个非唯一的非聚集键。我有足够的磁盘空间来执行重新索引。

所以我的问题是:人们认为这大概需要多长时间?估算重新索引时间的经验法则是什么?

答案1

无法估计需要多长时间——很多不同的事情都会产生影响。类似于什么Paul 写了关于 CHECKDB 的长度,索引等也会涉及非常相似的事情。最好的答案是过去花了多长时间?如果您无法确定,下一个最佳选择可能是在类似的非生产环境中尝试,但即使这样也不一定匹配(即并发性问题等会有所不同)。

顺便说一句,您可能需要研究 Sql 2005 及更高版本中的 ONLINE INDEX OPERATIONS...我无法添加第二个超链接,但可以谷歌搜索“online index operations sql server”并单击顶部链接。

答案2

您真的检查过表/索引的碎片程度吗?尝试对数据库运行以下查询(该查询在 SQL2005 或更高版本上运行)。请注意,此查询将影响您的服务器,应在安静的时间运行:

SELECT    OBJECT_NAME(i.OBJECT_ID) AS TableName,
        i.name AS IndexName,
        indexstats.avg_fragmentation_in_percent
FROM    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') indexstats
        INNER JOIN sys.indexes i ON i.OBJECT_ID = indexstats.OBJECT_ID
    AND i.index_id = indexstats.index_id

您可以有选择地重新索引最分散的表/索引。

答案3

任何数据库操作都高度依赖于运行它的硬件。

既然你说你已经剪掉了非常多的行,那么在非高峰时段运行它应该没有问题。

您可以设置复制并将该数据库提供给您的客户,同时清理旧数据库并将其设置为只读,以便他们仍然可以获取他们可能需要的任何数据。

答案4

最初重建表后,您将需要设置维护作业以定期整理碎片/重建索引。Michelle Ufford 又名 @SQLFool 有一套出色的脚本可用于此目的:

http://sqlfool.com/2009/06/index-defrag-script-v30/

您可以设置何时进行碎片整理或重建的阈值。它会自动检测哪些索引可以在线重建,并执行此操作,从而为您带来一些正常运行时间优势。

请注意,索引操作会将大量活动投入到事务日志中,这会真正减慢数据库镜像和事务日志备份的速度。

相关内容