利用sys.dm_db_index_physical_stats查看索引碎片等数据(转)

我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最大效率。

那么我们要如何知道索引的碎片大小呢?在sql server中,碎片的大小是使用碎片比来体现的,按msdn上面的说法,如果碎片比小于30%,我们可以重新组织索引,如果碎片比大于等于30%,我们可以选择重新生成索引。

那么我们在那里可以查看到碎片比呢?最简单的就是在microsoft sql server management studio中选择:要查看的索引所在的表- >"索引",选择要查看的索引,选择"重新生成"或者"重新组织",在弹出框的"碎片总计"栏中,显示的就是该索引的碎片比了。

当然,在本文中,我们主要是要讲解通过sys.dm_db_index_physical_stats动态函数来查看索引的碎片比率。

先看看sys.dm_db_index_physical_stats的定义:

sys.dm_db_index_physical_stats (      {database_id | NULL }     , { object_id | NULL }     , { index_id | NULL | 0 }     , { partition_number | NULL }     , { mode | NULL | DEFAULT } )

解释一下:
database_id--要查看索引所在数据库,当前数据库ID我们可以用db_id()函数来取到
object_id--要查索引所在表的id,比如我们要查看表T1,可以用object_id(‘T1‘)来取到该表的ID
index_id--要查看索引的索引号,该索引也同样可以用object_id(‘索引名‘)来获取
partition_number--对象中的分区号。partition_number为int类型。有效的输入包括索引或堆的 partion_number 或 NULL
mode--在msdn中的解释是这样的:
函数的执行模式将确定为了获取此函数所使用的统计信息数据而执行的扫描级别。mode 被指定为 LIMITED、SAMPLED 或 DETAILED。此函数将遍历构成表或索引的指定分区的分配单元页链。
LIMITED:模式运行最快,扫描的页数最少。对于堆,它将扫描所有页,但对于索引,则只扫描叶级上面的父级别页。

SAMPLED:模式将返回基于索引或堆中所有页的 1% 样本的统计信息。如果索引或堆少于 10,000 页,则使用DETAILED模式代替 SAMPLED。

DETAILED:模式将扫描所有页并返回所有统计信息。

从 LIMITED 到 DETAILED 模式,速度将越来越慢,因为在每个模式中执行的任务越来越多。若要快速测量表或索引的大小或碎片级别,请使用 LIMITED 模式。它的速度最快,并且对于索引的IN_ROW_DATA 分配单元中的每个非叶级别,不返回与其对应的一行。

下面通过示例来查看:
比如我要查看当前数据库的Assets_BackUp_Assets表的索引情况,可以用以下的语句查询:

select * from sys.dm_db_index_physical_stats(db_id(),object_id(‘Assets_BackUp_Assets‘),null,null,null)

解释一下几个比较有用返回列:
database_id:当前数据库ID,也就是db_id()
object_id列:当前表的ID,也就是object_id(‘Assets_BackUp_Assets‘)
index_id列:当前索引的ID,假如Assets_BackUp_Assets中有两个索引,index_id分别为1和2,如果我们只想查看索引1的情况,可以用
select * from sys.dm_db_index_physical_stats(db_id(),object_id(‘Assets_BackUp_Assets‘),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。

读者可以自己做测试:

Create table T(Col nchar(200) ,Col2 nvarchar(max) ) Create clustered index IX_T on T(Col) select * from sys.dm_db_index_physical_stats(db_id(),object_id(‘T‘),null,null,null) insert into T select REPLICATE(‘Roy‘,50),REPLICATE(‘Roy_88‘,2000) select * from sys.dm_db_index_physical_stats(db_id(),object_id(‘T‘),null,null,null) drop table T

补充一点:sys.dm_db_index_physical_stats函数中五个参数都可以为null。

select * from sys.dm_db_index_physical_stats(db_id(),null,null,null,null)

查询当前库的所有表的索引情况

select * from sys.dm_db_index_physical_stats(null,null,null,null,null)

查询所有数据库中所有索引情况,当然了,前提是你必须有查询其它数据库索引的权限,如果权限不够,会返回错误:
用户没有执行此操作的权限

以上为本章的全部内容,讲述的比较零乱,希望大家见谅。
在本站后面的文章中会继续讲述如何利用SQL重新生成与重新组织索引,请关注!

来源:.net学习网 说明:所有来源为 .net学习网 的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!

时间: 2024-11-05 22:58:17

利用sys.dm_db_index_physical_stats查看索引碎片等数据(转)的相关文章

利用sys.dm_db_index_physical_stats查看索引大小/碎片等信息

我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而我们对数据表进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,对性能产生很大的影响,索引碎片越多对数据库查询的性能影响就越大,这时我们就需要对索引重新组织或重新生成,以达到索引的最大效率. www.2cto.com    在sqlserver中索引碎片的大小是以百分比来体现的,如果索引碎片的百分比大于30%以上,就会对影响查询的性能.这时候我们就需要对该索引进行重新组织或重新生成了,重新组织或重新生成之

查看索引碎片,并生成重建索引代码

--查看索引碎片: USE dbname SELECT schema_name(T.schema_id) AS Schema_Name,T.Name AS Table_Name,I.name AS Index_Name, I.type AS Index_Type,D.avg_fragmentation_in_percent AS avg_fragmentation_in_percent,page_count into #t_index FROM sys.dm_db_index_physical_

【基本优化实践】【1.2】索引优化——查看堆表、查看索引使用情况、查看索引碎片率

[1]查看堆表 --查看堆表且行大于等于10W的 select * from ( SELECT tables.NAME, (SELECT rows FROM sys.partitions WHERE object_id = tables.object_id AND index_id = 0 -- 0 is for heap -- 1 is for clustered index And rows >=100000 )AS numberofrows FROM db_tank.sys.tables

查看索引碎片和维护

SELECT  a.index_id , b.name , a.avg_fragmentation_in_percent FROM    sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(''), NULL, NULL, NULL) as a JOIN sys.indexes as b ON a.object_id = b.object_id AND b.index_id = a.index_id 当 5%<avg_fragmentation_i

SqlServer索引碎片

1.产生碎片的操作 通过sys.dm_index_physical_stats来查看,索引上的页不在具有连续性时就会产生碎片,碎片是索引上页拆分的物理结果. (1).插入操作: INSERT操作在聚集索引和非聚集索引上都可以引起碎片 使用业务键或者GUID等类型 做聚集索引,很容易产生碎片 代码如下: IF OBJECT_ID('dbo.Table_GUID') IS NOT NULL DROP TABLE dbo.Table_GUID; CREATE TABLE Table_GUID ( Ro

SQL Server数据库表索引碎片整理

在SQLServer数据库,通过DBCC ShowContig或DBCC ShowContig(表名)检查索引碎片情况,指导我们对其进行定时重建整理. 运行结果如下: 1 2 3 4 5 6 7 8 9 10 11 DBCC SHOWCONTIG 正在扫描 'tbModule' 表... 表: 'tbModule'(1845581613):索引 ID: 0,数据库 ID: 9 已执行 TABLE 级别的扫描. - 扫描页数.....................................

SQL Server通过整理索引碎片和重建索引提高速度

SQL Server数据库操作中,当数据库中的记录比较多的时候,我们可以通过索引来实现查询.但是当索引碎片太多的时候,就会很严重地影响到查询的速度.这时候我们可以采取两种方法来解决:一种时整理索引碎片,另一种是重建索引.本文主要介绍了这一过程,接下来就让我们来一起了解一下吧. 检查索引碎片DBCC SHOWCONTIG(表),得到如下结果: DBCC SHOWCONTIG 正在扫描 'A' 表... 表: 'A'(884198200):索引 ID: 1,数据库 ID: 13 已执行 TABLE 

SQL Server查看索引重建、重组索引进度

原文:SQL Server查看索引重建.重组索引进度 相信很多SQL Server DBA或开发人员在重建或重组大表索引时,都会相当郁闷,不知道索引重建的进度,这个对于DBA完全是一个黑盒子,对于系统负载非常大的系统或维护窗口较短的系统,你会遇到一些挑战.例如,你创建索引的时候,很多会话被阻塞,你只能取消创建索引的任务.查看这些索引维护操作的进度.预估时间对于我们有较大的意义,需要根据这个做一些决策.下面我们来看看看看如何获取CREATE INDEX.ALTER INDEX REBUILD.AL

利用闪回查看Oracle表历史时刻数据

利用闪回查看Oracle表历史时刻数据 1.查看表历史时刻数据 select * from tab_test AS OF TIMESTAMP to_timestamp('20140917 10:00:00','yyyymmdd hh24:mi:ss'); 2.利用flashback table恢复表到过去某一时刻 alter table tab_test enable row movement; flashback table tab_test to timestamp ('20140917 1