📜  重新索引所有表 sql server - SQL (1)

📅  最后修改于: 2023-12-03 15:42:06.688000             🧑  作者: Mango

重新索引所有表 SQL Server

在 SQL Server 数据库中,索引是一种数据结构,用于加快数据检索过程的速度。如果索引不正确或过时,会导致查询效率低下,因此需要及时重新索引。

为什么需要重新索引

SQL Server 中的索引需要定期重新构建或重新组织,以保证其最佳性能。具体原因如下:

  1. 插入、更新和删除操作可能会改变索引的结构,导致索引过于分散或过于密集,从而影响查询性能。
  2. 随着数据量的增大,索引也会变得不稳定,需要重新构建或重新组织以减少碎片和提高性能。
  3. 数据库的使用模式可能会发生变化,某些查询的使用频率可能会增加或减少,索引也需要相应地进行调整。
如何重新索引

在 SQL Server 中,可以通过以下两种方式重新索引:

  1. 使用 SQL Server Management Studio(SSMS)进行重新索引。
  2. 使用 Transact-SQL 命令重新索引。

在此,我们介绍第二种方法,即使用 Transact-SQL 命令重新索引。

1. 确定需要重新索引的表

在重新索引之前,需要确定哪些表需要进行重新索引。您可以通过以下两种方式确定需要重新索引的表:

  1. 检查数据库中的系统表。
SELECT
  OBJECT_SCHEMA_NAME(i.OBJECT_ID) AS SchemaName,
  OBJECT_NAME(i.OBJECT_ID) AS TableName,
  i.name AS IndexName,
  i.index_id,
  s.avg_fragmentation_in_percent
FROM
  sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'LIMITED') s
  INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
WHERE
  OBJECTPROPERTY(i.OBJECT_ID,'IsUserTable') = 1
  AND s.avg_fragmentation_in_percent > 30
ORDER BY
  s.avg_fragmentation_in_percent DESC;

这段代码将返回数据库中所有平均碎片率大于 30% 的表。

  1. 使用 SQL Server Management Studio 中的 Index Tuning Wizard。
2. 重新索引表

确定需要重新索引的表后,可以使用以下代码重新索引表:

USE [DatabaseName];
GO

EXEC sp_msforeachtable @command1='PRINT ''Rebuilding index for table ?''', @command2='ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 90, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF);';

GO

此代码将通过 sp_msforeachtable 存储过程自动循环重新索引所有表。

总结

在 SQL Server 中,定期重新索引是保证数据库高性能的一项重要举措。您可以使用 SQL Server Management Studio 或 Transact-SQL 命令来重新索引表,将索引保持在最佳状态,提高查询性能。