索引数据库相关工作者的日常工作中占据了很重要的位置,索引需要牵涉到索引创建、优化和维护多方面的工作,本文以实例结合相关原理来介绍索引维护相关的知识。文中的相关代码,也可以满足多数情况下索引的维护需求。原文引用这里:http://database.ctocio.com.cn/tips/69/8078069_1.shtml

  实现步骤

  1. 以什么标准判断索引是否需要维护?

  2. 索引维护的方法有哪些?

  3. 能否方便地整理出比较通用的维护过程,实现自动化维护?

  一、 以什么标准判断索引是否需要维护?

  由于本文集中讨论索引维护相关,所以我们暂且抛开创建的不合理的那些索引,仅从维护的角度来讨论。从索引维护的角度来讲,最主要的参考标准就是索引碎片的大小。通常情况下,索引碎片在10%以内,是可以接受的。下面介绍获取索引碎片的方法:

SQL Server索引维护指导SQL Server 2000DBCC SHOWCONTIG
SQL Server索引维护指导SQL Server 
2005: sys.dm_db_index_physical_stats
SQL Server索引维护指导
--实例(取db_test数据库所有索引碎片相关信息):
SQL Server索引维护指导--
SQL Server 2000:
SQL Server索引维护指导
USE [db_test];
SQL Server索引维护指导
GO
SQL Server索引维护指导
DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES
SQL Server索引维护指导
GO 
SQL Server索引维护指导
--SQL Server 2005:
SQL Server索引维护指导
DECLARE @db_name VARCHAR(256)
SQL Server索引维护指导
SET @db_name='db_test'  
SQL Server索引维护指导
SELECT 
SQL Server索引维护指导   
db_name(a.database_id) [db_name],
SQL Server索引维护指导   c.name 
[table_name]
SQL Server索引维护指导   b.name 
[index_name]
SQL Server索引维护指导   a.avg_fragmentation_in_percent
SQL Server索引维护指导
FROM 
SQL Server索引维护指导   sys.dm_db_index_physical_stats (
DB_ID(@db_name), NULL,NULLNULL'Limited'AS a
SQL Server索引维护指导 
JOIN 
SQL Server索引维护指导   sys.indexes 
AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
SQL Server索引维护指导 
JOIN
SQL Server索引维护指导   sys.tables 
AS c ON a.object_id = c.object_id
SQL Server索引维护指导
WHERE 
SQL Server索引维护指导  a.index_id
>0 
SQL Server索引维护指导  
AND a.avg_fragmentation_in_percent>5 --碎片程度大于5

二、 索引维护的方法有哪些?

注:维护方式的选择,一方面要考虑是否是联机维护,另一方面就是速度上的考虑。一般
碎片<=30%时,使用重新组织的方法速度比索引重建快;
碎片>30%时,索引重建的速度比重新组织要快。

1. 联机维护

SQL Server索引维护指导SQL Server2000:
SQL Server索引维护指导
DBCC INDEXDEFRAG 重新组织索引,占用资源少,锁定资源周期短,可联机进行。
SQL Server索引维护指导SQL Server 
2005:
SQL Server索引维护指导
1. 联机重新组织:
SQL Server索引维护指导
ALTER INDEX [index_name] ON [table_name]
SQL Server索引维护指导REORGANIZE;
SQL Server索引维护指导
2. 联机重建:
SQL Server索引维护指导
ALTER INDEX [index_name] ON [table_name]
SQL Server索引维护指导REBUILD 
WITH (FILLFACTOR = 85, SORT_IN_TEMPDB = OFF, STATISTICS_NORECOMPUTE = ON,ONLINE = ON);

2. 脱机维护

SQL Server索引维护指导SQL Server2000:DBCC DBREINDEX
SQL Server索引维护指导
SQL Server索引维护指导SQL Server 
2005ALTER INDEX [indexname] ON [table_name] REBUILD;
SQL Server索引维护指导
CREATE INDEX WITH DROP_EXISTING

3. 能否方便地整理出比较通用的维护过程,实现自动化维护?
a) 获取及查看所有索引的碎片情况  SQL Server2000:
查看结果
SQL Server 2005:
 dba_manage_index_defrag –查看结果

GO

SQL Server索引维护指导--针对SQL Server 2000的脱机维护:
SQL Server索引维护指导
sp_msforeachtable @command1="dbcc dbreindex('?','',85)"

GO

总结

  索引的维护是有参考依据的,应该根据具体的碎片情况以及是否需要联机操作等需求,采用合理的维护方法。自动化的索引维护策略是可行的

相关文章: