利用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)
查询所有数据库中所有索引情况,当然了,前提是你必须有查询其它数据库索引的权限,如果权限不够,会返回错误: 用户没有执行此操作的权限。
利用sys.dm_db_index_physical_stats查看索引碎片等数据的更多相关文章
- 利用sys.dm_db_index_physical_stats查看索引碎片等数据(转)
我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最 ...
- 利用sys.dm_db_index_physical_stats查看索引大小/碎片等信息
我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而我们对数据表进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,对性能产生很大的影响,索引碎片越多对数据库查 ...
- sql server 查看索引碎片大小,并定期重建索引
查看碎片情况使用 dbcc showcontig 函数来进行 代码: --改成当前库 use DB_Name --创建变量 指定要查看的表 declare @table_id int set @ ...
- Oracle查询索引碎片及数据表空间使用情况
--检查索引碎片情况,只能对单个表进行分析. --需要注意块的大小.索引的pctfree的值的大小.rowid的长度的不同,根据不同的情况修改相应的值 select index_name, c.NMB ...
- SqlServer索引碎片
1.产生碎片的操作 通过sys.dm_index_physical_stats来查看,索引上的页不在具有连续性时就会产生碎片,碎片是索引上页拆分的物理结果. (1).插入操作: INSERT操作在聚集 ...
- SQL Server通过整理索引碎片和重建索引提高速度
本文章转载:http://database.51cto.com/art/201108/282408.htm SQL Server数据库中,当索引碎片太多时,就会拖慢数据库查询的速度.这时我们可以通过整 ...
- 14-SQLServer索引碎片
一.总结 1.数据库的存储本身是无序的,建立聚集索引之后,就会按照聚集索引的物理顺序存入硬盘: 2.建立索引完全是为了提升读取的速度,相对写入的速度就会降低,没有索引的表写入时最快的,但是大多数系统读 ...
- [转]整理索引碎片,提升SQL Server速度
数据库表A有十万条记录,查询速度本来还可以,但导入一千条数据后,问题出现了.当选择的数据在原十万条记录之间时,速度还是挺快的:但当选择的数据在这一千条数据之间时,速度变得奇慢. 凭经验,这是索引碎片问 ...
- SQL Server查看索引重建、重组索引进度
相信很多SQL Server DBA或开发人员在重建或重组大表索引时,都会相当郁闷,不知道索引重建的进度,这个对于DBA完全是一个黑盒子,对于系统负载非常大的系统或维护窗口较短的系统,你会遇到一些挑战 ...
随机推荐
- MVC中HTML控件设为只读readonly
http://www.th7.cn/web/html-css/201501/78934.shtml 1.下拉框设为只读试了试用这个有效: @Html.DropDownListFor(model =&g ...
- linux命令总结kill命令详解
1.作用 kill命令用来中止一个进程. 2.格式 kill [ -s signal | -p ] [ -a ] pid ... kill -l [ signal ] 3.参数 -s:指定发送的信号. ...
- 科学计算三维可视化---Mayavi入门(Mayavi介绍和安装)
Mayavi介绍 是基于VTK开发的可视化软件(更加高效),Mayavi完全由python编写,方便使用,而且可以使用python编写扩展,嵌入到用户程序中 安装要求 VTK >pip3 ins ...
- 编译的java工程压缩上传到linux服务器上后,中文的类名显示乱码
首先声明,类名是用中文命名的,这个别人写的,不允许修改. 本地用7zip软件压缩成zip包,传到服务器解压,发现中文的class文件名称是乱码. 解决办法: 方法一:使用jar命令打成jar包,传到服 ...
- jar包读取包内properties文件
properties位于src目录下 project --src -----package -----test.properties Properties p = new Properties(); ...
- VIM各种快捷应用
vim +n filename 打开文件,光标直接跳转到第n行 w 移动光标到下一个单词的词首, b 移动光标到上一个单词的词首 e 移动光标到下一个单词的结尾, ge 移动光标到上 ...
- bzoj千题计划125:bzoj1037: [ZJOI2008]生日聚会Party
http://www.lydsy.com/JudgeOnline/problem.php?id=1037 一个区间是否满足 任意连续的一段,男孩与女孩的数目之差不超过k, 取决于男孩与女孩数目之差的最 ...
- jquery中美元符号命名冲突问题解决
在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg') 的写法.然而,当我们引入多个js库后,在另外一个js库 ...
- Presto通过RESTful接口新增Connector
在实际使用Presto的过程中,经常会有以下的一些需求. 添加一个新的Catalog 对不再使用的Catalog希望把它删除 修改某个Catalog的参数 但在Presto中如果进行上述的修改,需要重 ...
- C++中getline()和cin()同时使用时的注意事项
今天做tju的oj,遇到一个问题,想前部分用cin函数一个一个的读入数据,中间部分利用getline()一起读入一行,但是测试发现,cin之后的getline函数并无作用,遂谷歌之.原来cin只是在缓 ...