保持索引的健康

  • 概述

对于数据库的索引,最典型的描述,便是以书本的目录为比喻了.在许多场景下,使用索引,可以帮助程序更加快速地定义到需要的所需的数据.

然而,对于数据库而言而言.数据表的记录并不会一层不变,可以通过许多途径对表数据进行插入、更新、删除等操作。表数据的这些操作,以数据为依据的索引,在数据更新的过程中,同样需要做到与数据的更新同步(当然,还包括一些统计信息等数据库内部评估使用的信息的自动更新等)。当索引的节点在数据插入,删除或者更新的时候,需要在索引结构中按其排列顺序进行节点位置的更新,数据库为了确保更快速地更新索引,使用最快速的算法进行索引信息的同步,即,对索引页中数据的移动,在索引页空间不足的情况下,还需要对索引页进行拆分,从而造成了许多索引碎片。

  • 分析

索引碎片的分析,在SQL Sever 2000中,保罗大师为我们提供了DBCC SHOWCONTIG工具。因为现在基本上使用的是SQL Server 2005,所以就使用保罗提供的另外一个更好用的工具DMV sys.dm_db_index_physical_stats进行分析。

select ix.name,--索引名称
	ps.index_type_desc,--索引类型
	alloc_unit_type_desc,--存储单元类型(行内数据,溢出行,大数据行)
	index_depth,--索引深度
	avg_fragmentation_in_percent,--索引碎片的百分比,>=30,便需要考虑重建索引
	avg_fragment_size_in_pages--索引碎片在索引页中的数量
from sys.dm_db_index_physical_stats(db_id('DbName'),object_id('TableName'),null,null,'Sampled') ps
	join sys.indexes ix on ps.[object_id] = ix.[object_id] and ps.index_id = ix.index_id
如下图中所示, 是一个简单表的示例.
image 
 
posted @ 2010-07-19 14:56  老玉米  阅读(283)  评论(0编辑  收藏  举报