35

目前我们的数据库大小为 10 GB,并且每月增长约 3 GB。我经常听说应该不时重建索引,以提高查询执行时间。那么在给定的场景中,我应该多久重建一次索引呢?

4

5 回答 5

51

有一个普遍的共识是,一旦索引碎片达到 5 个以上(有时 10%),你应该重新组织(“碎片整理”)你的索引,当它超过 30% 时你应该完全重建它们(至少这是我的数字)听说很多地方都提倡)。

Michelle Ufford(又名“SQL Fool”)有一个自动索引碎片整理脚本,它使用这些确切的限制来决定何时重组或重建索引。

另请参阅Brad McGehee 关于重建索引的技巧,其中包含一些关于如何处理索引重建的好想法和技巧。


我在这里使用这个脚本(不记得我从什么时候得到这个的——不管是谁:非常感谢!非常有用的东西)来显示给定数据库中所有索引的索引碎片:

SELECT 
    t.NAME 'Table name',
    i.NAME 'Index name',
    ips.index_type_desc,
    ips.alloc_unit_type_desc,
    ips.index_depth,
    ips.index_level,
    ips.avg_fragmentation_in_percent,
    ips.fragment_count,
    ips.avg_fragment_size_in_pages,
    ips.page_count,
    ips.avg_page_space_used_in_percent,
    ips.record_count,
    ips.ghost_record_count,
    ips.Version_ghost_record_count,
    ips.min_record_size_in_bytes,
    ips.max_record_size_in_bytes,
    ips.avg_record_size_in_bytes,
    ips.forwarded_record_count
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips
INNER JOIN  
    sys.tables t ON ips.OBJECT_ID = t.Object_ID
INNER JOIN  
    sys.indexes i ON ips.index_id = i.index_id AND ips.OBJECT_ID = i.object_id
WHERE
    AVG_FRAGMENTATION_IN_PERCENT > 0.0
ORDER BY
    AVG_FRAGMENTATION_IN_PERCENT, fragment_count
    
于 2010-02-16T19:37:24.163 回答
7

“当你需要”和“当你可以”!

例如...

  • 首先测试碎片并决定是什么都不做,重组还是重建。 SQL Fool 的脚本就是这样做的,例如 has@minFragmentation@rebuildThresholdparameters

  • 比如说,每天做统计,但在周末做索引。您的维护窗口是多少?

于 2010-02-16T19:24:28.117 回答
3

您应该经常重建索引,以便生产不会受到索引退化的不利影响。我知道这似乎含糊不清,但所有数据库都是不同的,并且以不同的方式使用。您只需要定期重建/碎片整理导致写入操作(插入/更新)的索引 - 您的静态或大部分只读表不需要太多重新索引。

您将需要使用dbcc showcontig([Table])来检查索引的碎片级别,确定它们的碎片频率以及碎片实际上是什么级别。

当索引变得过于碎片化(超过 20%-30% 左右)时,用于dbcc dbreindex([Table])完全重建索​​引,但如果您找不到足够大的停机时间窗口并且碎片级别相对较低(1%-25%),则应dbcc indexdefrag([Database], [Table], [Index])使用以“在线”方式对索引进行碎片整理。另请记住,您可以停止索引碎片整理操作并在以后重新启动它而不会丢失任何工作。

保持数据库及其索引“协调一致”需要进行一些监控才能真正了解何时以及什么重新索引。

于 2010-02-16T19:42:38.143 回答
1

鉴于数据库的大小,您可以每月轻松地重建一次索引。但是随着大小的增加,比如大约 500 GB,您可以每月执行两次。

于 2010-02-16T19:02:24.080 回答
0

Bacon Bits 评论 中提到Ola Hallengren 的 SQL Server 维护解决方案  IndexOptimize 在 SQL Server 2008、SQL Server 2008 R2、SQL Server 2012、SQL Server 2014、SQL Server 2016、SQL Server 2017、SQL Server 2019、Azure SQL 数据库和 Azure 上受支持SQL 数据库托管实例。它在https://github.com/olahallengren/sql-server-maintenance-solution
上有 2K 颗星。

Michelle Ufford(又名“SQL Fool”)的 自动索引碎片整理脚本,在接受的答案中建议,在概念上似乎与 Ola Hallengren 的 SQL Server 维护解决方案相同,但最新版本是 2011 年。

于 2021-11-01T12:36:33.623 回答