database_id:当前数据库ID,也就是db_id()
object_id列:当前表的ID,也就是object_id(‘dbo.Orders‘)
index_id列:当前索引的ID,假如dbo.Orders中有两个索引,index_id分别为1和2,如果我们只想查看索引1的情况,可以用
select * from sys.dm_db_index_physical_stats(db_id(),object_id(‘dbo.Orders‘),1,null,null)
partition_number列:当前索引所在分区号,同sys.dm_db_index_physical_stats定义中的partition_number参数
index_type_desc列:索引类型-聚集索引或者非聚集索引等。
alloc_unit_type_desc列:分配单元类型--这个在下面解释
avg_fragmentation_in_percent列:最重要的列,当前索引碎片比率。
分配单元类型讲解:
IN_ROW_DATA:包含除大型对象 (LOB) 数据以外的所有数据的数据行或索引行。页的类型为 Data 或 Index。
LOB_DATA:以下列一种或多种数据类型存储的大型对象数据:text、ntext、image、xml、varchar(max)、nvarchar(max)、varbinary(max) 或 CLR 用户定义类型 (CLR UDT)。页的类型为 Text/Image。
ROW_OVERFLOW_DATA:存储在超过 8,060 字节行大小限制的 varchar、nvarchar、varbinary 或 sql_variant 列中的可变长度数据。页的类型为 Data。
注意:有时候,我们只为表创建了一个索引,但通过sys.dm_db_index_physical_stats却查出了两条记录,这就是因为在表中使用了text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)和xml列,也就是LOB_DATA存储单元.使用了这些列后,在创建表但未插入数据前只有一条记录,但有插入过数据后,就会有两条记录了,两条记的区别就是alloc_unit_type_desc中的值的区别,可能的情况就是一条的值是N_ROW_DATA,另一条的值是LOB_DATA。
www.2cto.com
我们可以通过一个例子来测试:
首先,新建一个表并且建立一个聚合索引:
CREATE TABLE TestTable(rows NCHAR (200) ,rows2 NVARCHAR (max) )
CREATE CLUSTERED INDEX _data_index_TestTable ON TestTable(rows)
在没有插入数据的情况下:
SELECT * FROM TestTable
SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(),OBJECT_ID(‘TestTable‘),null,null,null)
如下图,在创建表但未插入数据前只有一条记录:
然后,插入数据的情况下:
www.2cto.com
INSERT INTO TestTable SELECT REPLICATE(‘li‘,50),REPLICATE(‘hongkong_8‘,2000)
SELECT * FROM TestTable
SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(),OBJECT_ID (‘TestTable‘),null,null,null)如下图,
如下图,出现了两条记录,这就是因为在表中使用了nvarchar(max)列,也就是LOB_DATA存储单元