第十章——维护索引(1)——索引碎片

原文:第十章——维护索引(1)——索引碎片

本系列包含:

1、  查找碎片。

2、  使用填充因子。

3、  使用REBUILD来加索引性能。

4、 使用REORGANIZE来加索引性能。

5、  如何查找丢失索引。

6、  如果查找无用索引。

7、  通过创建索引视图提高性能。

8、  通过创建索引在计算列增加性能。

9、  计算索引消耗的磁盘空间。

 

前言:

DBA的日常任务并不仅仅是创建需要的索引在对应的列上,实际上,DBA还要保持索引创建的高标准。

周而复始,DBA必须盯着一些非常重要的信息:

1、  索引的碎片级别

2、  丢失索引

3、  无效索引

 

查找索引碎片:

        如果索引没有正确维护,那么碎片往往会成为性能瓶颈。微软建议当碎片百分比在5~30之间的时候,使用重组索引来代替更加耗资源的重建索引。如果碎片超过30%,可以使用重建索引。但是这仅仅是建议而不是绝对的事情。而且从2000开始,这个建议就没有改变过,但是从2000到2012,索引已经改变了许多。

        现在先来检查一下环境,以便评估百分比的级别是否达到重建的地步。因为在进行这步耗资源的操作前,会有很多因素需要考虑,其中主要有:

1、  备份策略

2、  服务器工作负载

3、  可用磁盘空间

4、  恢复模式

 

虽然碎片对查询性能有很大的影响,但是它依然是基于表的,并且基于你如何使用表。大部分情况下,如果你仅仅从一个表中通过查询聚集索引上的主键来返回一条数据,那么碎片将不在考虑范围。

 

准备工作:

了解碎片之后,接着就要知道如何确定索引的碎片?此时只需要使用sys.dm_db_index_physical_stats系统函数和系统目录sys.Indexes联合查询即可。

 

步骤:

收集你的索引的碎片是第一个重要任务,可以使用以下脚本实现:

USE AdventureWorks

GO

--收集特定表上所有索引、堆的信息

SELECT  sysIn.name AS IndexName ,

        sysIn.index_id ,

        func.avg_fragmentation_in_percent ,

        func.index_type_desc AS IndexType ,

        func.page_count

FROM    sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(N'ordDemo'), NULL,

                                       NULL, NULL) AS func

        INNER JOIN sys.indexes AS sysIn ON func.object_id = sysIn.object_id

                                           AND func.index_id = sysIn.index_id

--聚集索引的Index_id为,非聚集索引的Index_id总是大于,如果不想看堆表的信息,可以使用

--where sysIn.index_id>0;       

--收集在数据库中所有可用的索引信息,下面查询可能会运行时间比较久:

USE AdventureWorks

GO

--收集特定表上所有索引、堆的信息

SELECT  sysIn.name AS IndexName ,

        sysIn.index_id ,

        func.avg_fragmentation_in_percent ,

        func.index_type_desc AS IndexType ,

        func.page_count

FROM    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS func

        INNER JOIN sys.indexes AS sysIn ON func.object_id = sysIn.object_id

                                           AND func.index_id = sysIn.index_id

WHERE   sysIn.index_id > 0 ;

 

 

分析:

       在函数sys.dm_db_index_physical_stats中传入DB_ID()可以限制只返回当前数据库的信息,而object_ID(N’ordDemo’)是返回这个数据库中这个表的索引信息。这个系统函数:sys.dm_db_index_physical_stats可以提供非常详细的信息,为了知道索引名称,需要关联sys.indexes系统目录来获得名称。

 

扩展信息:

       当在索引叶子节点中的数据逻辑顺序和物理顺序不一致的时候,就会出现碎片。当你创建一个索引时,会对所有东西排序,但是当数据通过DML语句操作是,并不能保证新数据能适应数据页的顺序。当你删除数据时,不仅只从实际数据页上删除数据,也会释放数据也的空间来用于其他数据的使用,这就会产生碎片。

       记住,当索引第一次创建是,只有少量甚至没有碎片,但是在增删改操作后,就开始出现碎片。

时间: 2024-11-08 19:05:26

第十章——维护索引(1)——索引碎片的相关文章

第十章——维护索引(3)——通过重建索引提高性能

原文:第十章--维护索引(3)--通过重建索引提高性能 前言: 重建一个索引只是在内部删除并重建索引,使得碎片消失.统计信息更新.物理顺序重新排列组织.它会压缩数据页,按照填充因子填充适当的数据.如果有需要,也会添加新的数据页.这些操作有利于提高数据查找的速度,但是这个工作如果发生在大表上面,将是非常耗时耗资源的.   准备工作: 首先先要决定是否达到了重建索引的临界值.否则,重组索引会更好.当碎片超过30%,那么重建索引会比较好. 重建索引有两种方式,在重建之前应该考虑使用哪种会更好: 1. 

第十章——维护索引(2)——填充因子

原文:第十章--维护索引(2)--填充因子 前言:        在第九章中,已经介绍了如何使用索引,当一个索引创建时,以B-Tree格式存放数据,拥有根节点.中间节点.叶子节点.叶子节点是最底层的节点,在聚集索引中,包含了实际数据,而每个数据页有8KB.       当表中的数据的增删改发生时,会尝试把数据插入到合适的数据页中.比如有一个聚集索引在SSN上,当插入一个新的SSN数时.SQLServer会尝试把数据插入到合适的数据页,假设SSN从2开始,此时在最后的数据页中找到这个页面是以SSN

第十章——维护索引(5)——查找丢失索引

原文:第十章--维护索引(5)--查找丢失索引 前言: 在开发阶段,很难总是可以在合适的列上创建合适的索引.所以一开始创建的索引可能会无效,此时,需要找出这些无效的索引. 一般来说,当一个查询执行的时候,SQLServer优化器会选择最适合的索引进行执行,当没有找到合适的索引话,优化器会产生一个次优执行计划,并且把丢失索引的信息存放到DMVs上. 当SQLServer服务重启后,所以存储在DMVs上的信息都会丢失,所以最好在正常使用大概1周后收集这些信息,会比较有效.   准备工作: 关于索引相

第十章——维护索引(7)——使用索引视图提高性能

原文:第十章--维护索引(7)--使用索引视图提高性能 前言: 视图是一个包含了一个或多个表的数据列的虚拟表.通常情况下,它仅仅是存储了查询的对象,一个视图可以当作一个表,可以用于存储过程.JOIN.用户自定义函数等等. 视图包含了下面两个主要特性: 1. 提供了一个安全机制,用于限制用户只能访问特定的数据. 2. 使得开发人员能定制用户的逻辑视图.   当你查询一个视图时,优化器会产生一个单一的执行计划给这个查询.在索引视图未出现之前,视图必须解决查询在执行期间才硬化.所有的JOIN.聚合都在

第十章——维护索引(6)——查找无用索引

原文:第十章--维护索引(6)--查找无用索引 前言: 众所周知,索引对性能的提升有巨大作用.但是这是有代价的,索引需要磁盘空间来存放它的B-Tree,并且用于在每次DML执行后更新信息,所以应该在一定时期内检查有无无用索引.     准备工作: 记住别在重启服务器之后进行信息收集,因为DMO将会清空,而数据会非常不准确甚至是错误的.所以应该在运行了一段时间后(业务周期)再做收集. 业务周期根据实际情况而定.一些表和查询会每天频繁使用,但是一些类似报表功能可能是一月甚至一年执行一次,所以,除非必

第十章——维护索引(8)——在计算列中创建索引提高性能

原文:第十章--维护索引(8)--在计算列中创建索引提高性能 前言: 在理解计算列上的索引之前,先了解计算列的基本知识.计算列由可以使用同一表中的其他列的表达式计算得来.表达式可以是非计算列的列名.常量.函数,也可以是用一个或多个运算符连接的上述元素的任意组合.表达式不能为子查询. 默认情况下,计算列是一个虚拟的列,并且可以在调用时重新计算,直到在CREATE TABLE或者ALTER TABLE 命令中使用PERSISTED. 如果列定义成PERSISTED,会存放计算值,并存放在原始列上更新

高性能的MySQL(5)索引策略-索引和表的维护

维护表有三个主要的目的: 1.找到并修复损坏的表. 对于MyISAM存储引擎来说,表损坏通常是系统崩溃导致的.其他的引擎也会由于硬件的问题,MySQL本身的缺陷或者操作系统的问题导致索引的损坏. 损坏的索引,会导致查询返回错误的结果或者莫须有的主键冲突等问题,严重时还会导致数据库崩溃. 这类情况,可以尝试check table来检查是否发生了表损坏,有些存储引擎不支持这个命令. 可以使用repair table 来修复损坏的表,但同样不是所有引擎都支持该命令. 如果引擎不支持,可以使用alter

软件开发人员真的了解SQL索引吗(索引使用原则)

原文:软件开发人员真的了解SQL索引吗(索引使用原则)     前两篇文章我总结了一些SQL数据库索引的问题,这篇主要来分析下索引的优缼点,以及如何正确使用索引.       索引的优点:这个显而易见,正确的索引会大大提高数据查询,对结果进行排序.分组的操作效率.    索引的缺点:优点显而易见,同样缺点也是显而易见:    1:创建索引需要额外的磁盘空间,索引最大一般为表大小的1.2倍左右.    2:在表数据修改时,例如增加,删除,更新,都需要维护索引表,这是需要系统开销的.    3:不合

SQL Server 数据库索引其索引的小技巧_MsSql

一.什么是索引 减少磁盘I/O和逻辑读次数的最佳方法之一就是使用[索引] 索引允许SQL Server在表中查找数据而不需要扫描整个表. 1.1.索引的好处: 当表没有聚集索引时,成为[堆或堆表] [堆]是一堆未加工的数据,以行标识符作为指向存储位置的指针.表数据没有顺序,也不能搜索,除非逐行遍历.这个过程称为[扫描].当存在聚集索引时,非聚集索引的指针由聚集索引所定义的值组成,所以聚集索引变得非常重要. 因为页面大小固定,所以列越少,所能存储的行就越多.由于非聚集索引通常不包含所有列,所以一般