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

  www.2cto.com  
  在sqlserver中索引碎片的大小是以百分比来体现的,如果索引碎片的百分比大于30%以上,就会对影响查询的性能。这时候我们就需要对该索引进行重新组织或重新生成了,重新组织或重新生成之后,索引碎片就会被删除。

  那我们怎么才能知道每张表索引碎片的大小呢?方法有两种:
第一种:

1.右键索引,选择“全部重新组织”,会显示当前表全部所有索引,这是就可以看到“碎片总计”值是以百分比体现的,这时如果值有超过30%的,就要考虑是否要重新组织了。
  www.2cto.com  

2.如果要重新组织的话,点击“确定”即可。

第二种:利用 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('索引名')来获取
  www.2cto.com  
partition_number--对象中的分区号。partition_number为int类型。有效的输入包括索引或堆的 partion_number 或 NULL
mode--
函数的执行模式将确定为了获取此函数所使用的统计信息数据而执行的扫描级别。mode 被指定为 LIMITED、SAMPLED 或 DETAILED。此函数将遍历构成表或索引的指定分区的分配单元页链。
LIMITED:模式运行最快,扫描的页数最少。对于堆,它将扫描所有页,但对于索引,则只扫描叶级上面的父级别页。

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

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

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

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

SELECT * FROM sys.dm_db_index_physical_stats(db_id(),object_id('dbo.Orders'),null,null,null)

有用的列名解释:

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存储单元

利用sys.dm_db_index_physical_stats查看索引大小/碎片等信息的更多相关文章

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

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

  2. 利用sys.dm_db_index_physical_stats查看索引碎片等数据

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

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

    相信很多SQL Server DBA或开发人员在重建或重组大表索引时,都会相当郁闷,不知道索引重建的进度,这个对于DBA完全是一个黑盒子,对于系统负载非常大的系统或维护窗口较短的系统,你会遇到一些挑战 ...

  4. 学习MongoDB--(5-2):索引(查看索引的使用,管理索引)

    前一篇简单介绍了索引,并给出了基本的索引使用,这一次,我们进一步说一下MongoDB中的索引,包括如何查看查询是否走索引,如何管理索引和地理空间索引等. [使用explain和hint] 前面讲高级查 ...

  5. splunk设置索引周期和索引大小

    步骤一: 编辑/opt/splunk/etc/apps/search/local/indexs.conf ,在每个索引下面 加入最后两行内容 [messages] coldPath = $SPLUNK ...

  6. sql server 查看索引碎片大小,并定期重建索引

      查看碎片情况使用  dbcc showcontig 函数来进行 代码: --改成当前库 use DB_Name --创建变量 指定要查看的表 declare @table_id int set @ ...

  7. 利用DBCC PAGE查看SQL Server中的表和索引数据

    16:08 2013-01-06 参考http://doc.chinaunix.net/sqlserver/200810/206034.shtmlDBCC PAGE|IND 参数 DBCC PAGE ...

  8. 查看mysql库大小,表大小,索引大小

    查看所有库的大小 mysql> use information_schema; Database changed mysql> selectconcat(round(sum(DATA_LE ...

  9. [转]【mysql监控】查看mysql库大小,表大小,索引大小

    本文转自:http://blog.sina.com.cn/s/blog_4c197d420101fbl9.html 查看所有库的大小 mysql> use information_schema; ...

随机推荐

  1. 图解HTTP(六)HTTP首部

    一.HTTP报文的结构: 二.4种首部字段: 1. 通用首部字段 请求报文和响应报文都会使用的首部. 首部字段名 说明 Cache-Control 控制缓存行为 Connection 逐跳首部.连接的 ...

  2. C标准库函数--文件IO操作函数。

    C标准库文件读写函数总结:都是对文件流进行输入输出的函数分为对文件的有格式读写以及无格式读写 一.文件的无格式读写根据每次读写字符的数量,分为三类:1.按字符读写文件 按字符读有三个函数:以下三个函数 ...

  3. Linux运维二:CentOS6.6系统安装后的基本配置与优化

    CentOS6.6系统安装完成后还需要做一些配置与优化: 一:Linux内核版本号介绍 查看内核版本: [root@Gin scripts]# uname -r 2.6.32-504.el6.x86_ ...

  4. linux(ubuntu) 常用指令

    1.新建文件夹 mkdir mkdir test 2.进入文件夹 cd cd test 3.创建/修改文件 vim vim a.txt 如果不存在a.txt,就会新增a.txt; 如果存在,则修改 先 ...

  5. pymc

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  6. python 调用aiohttp

    1. aiohttp安装   pip3 install aiohttp 1.1. 基本请求用法 async with aiohttp.get('https://github.com') as r: a ...

  7. bzoj千题计划164:bzoj5123: 线段树的匹配

    http://www.lydsy.com/JudgeOnline/upload/201712/prob12.pdf dp[len][0/1] 表示节点表示区间长度为len,节点选/不选的 最大匹配 s ...

  8. 一道非常易错的js面试题

    题目如下: function Foo() { getName = function() { alert(1); }; return this; } Foo.getName = function() { ...

  9. @Resource,@Autowired,@Inject3种注入方式

    概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中. ANNOTATION PACKAGE SOURCE @Resource javax ...

  10. 【leetcode 简单】 第一百零八题 找到所有数组中消失的数字

    给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不 ...