SQL Server索引碎片维护进阶[亲测有效]

SQL Server索引碎片维护进阶[亲测有效]一、产生原因及影响 索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据,它的重要性体现在能够使数据库引擎快速返回查询结果。当对索引所在的基础数据表进行增删改时,若存

SQL Server索引碎片维护进阶

一、产生原因及影响

索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据,它的重要性体现在能够使数据库引擎快速返回查询结果。当对索引所在的基础数据表进行增删改时,若存储的数据进行了不适当的跨页(SQL Server中存储的最小单位是页,页是不可再分的),就会导致索引碎片的产生。随着索引碎片的不断增多,查询响应时间就会变慢,性能也因此而下降。要解决这个问题,可以通过重新生成或重新组织索引来解决。

二、碎片分类

2.1、外部碎片

当索引页不在逻辑顺序上时就会产生外部碎片。索引创建时,索引键按照逻辑顺序放在一组索引页上。当新数据插入索引时,新的键可能放在存在的键之间。为了让新的键按照正确的顺序插入,可能会创建新的索引页来存储需要移动的那些存在的键。这些新的索引页通常物理上不会和那些被移动的键原来所在的页相邻。创建新页的过程会引起索引页偏离逻辑顺序。

2.2、内部碎片

当索引页没有用到最大量时就产生了内部碎片。虽然在一个有频繁数据插入的应用程序里这也许有帮助,然而设置一个fill factor(填充因子)会在索引页上留下空间,服务器内部碎片会导致索引尺寸增加,从而在返回需要的数据时要执行额外的读操作。这些额外的读操作会降低查询的性能。

三、维护方法

1、删除索引并重建。

2、使用DROP_EXISTING语句重建索引。

3、使用ALTER INDEX REBUILD重新生成索引。(推荐)

4、使用ALTER INDEX REORGANIZE重新组织索引。(推荐)

四、注意事项

碎片率 采用方法
>30% ALTER INDEX REBUILD WITH(ONLINE = ON)
>5% 且 <=30% ALTER INDEX REORGANIZE

重新生成索引可以联机执行,也可以脱机执行。

重新组织索引始终联机执行。这些值提供了一个大致指导原则,用于确定应在ALTER INDEX REORGANIZE和ALTER INDEX REBUILD之间进行切换的点。不过,实际值可能会随情况而变化,必须要通过试验来确定最适合您环境的阈值。

非常低的碎片级别(小于5%)不应通过这些命令来解决,因为删除如此少量的碎片所获得的收益始终远低于重新生成或重新组织索引的开销。

切记:所有索引碎片维护一定要在凌晨(非业务高峰期间)进行!!!

五、优化指导原则

5.1、如何知道是否发生了索引碎片?

在SQL Server数据库中,可以通过DBCC SHOWCONTIG WITH ALL_INDEXESDBCC SHOWCONTIG(表ID或者表名) WITH ALL_INDEXES来检查索引碎片情况。

--方法一
--目标数据库
USE DB_NAME
--创建变量指定要查看的表
DECLARE @TABLE_ID INT
SET @TABLE_ID=OBJECT_ID("TABLE_NAME")
--执行
DBCC SHOWCONTIG(@TABLE_ID) WITH ALL_INDEXES

--方法二
USE DB_NAME
DBCC SHOWCONTIG("TABLE_NAME") WITH ALL_INDEXES

5.2、索引碎片判断标准

通过对逻辑扫描碎片(过高)、平均页密度(满)(过低)的结果分析,判定是否需要进行索引处理,如下所示:

逻辑扫描碎片 ………………:97.83% 该百分比应该在0%到10%之间,高了则说明有外部碎片。

平均页密度(满) ………………:62.42% 该百分比应该尽可能靠近100%,低了则说明有外部碎片。

SQL Server索引碎片维护进阶[亲测有效]

六、优化实践

6.1、手动方式

第一步:查询数据库所有表的索引信息。

SELECT OBJECT_NAME(B.OBJECT_ID) 表名,B.NAME 索引名称,A.INDEX_TYPE_DESC 索引类型,
    ROUND(A.AVG_FRAGMENTATION_IN_PERCENT,2) 碎片率
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) A 
    INNER JOIN sys.indexes B ON A.OBJECT_ID=B.OBJECT_ID AND A.INDEX_ID=B.INDEX_ID
WHERE 1=1
    AND A.AVG_FRAGMENTATION_IN_PERCENT>30
    --AND A.AVG_FRAGMENTATION_IN_PERCENT>5 AND A.AVG_FRAGMENTATION_IN_PERCENT<=30
ORDER BY OBJECT_NAME(B.OBJECT_ID),A.AVG_FRAGMENTATION_IN_PERCENT DESC

注:通过碎片率,依四、注意事项处理方式,也可以逐个对表的索引进行对应的重新生成或重新组织处理。

SQL Server索引碎片维护进阶[亲测有效]

第二步:生成数据库所有表的索引处理的SQL语句。

SELECT OBJECT_SCHEMA_NAME(B.OBJECT_ID) 架构,OBJECT_NAME(B.OBJECT_ID) 表名,B.NAME 索引名,ROUND(A.AVG_FRAGMENTATION_IN_PERCENT,2) 碎片率,
    CASE WHEN A.AVG_FRAGMENTATION_IN_PERCENT>30 THEN N"重新生成索引" ELSE N"重新组织索引" END 处理方式,
    "ALTER INDEX "+QUOTENAME(B.NAME)+" ON "+QUOTENAME(OBJECT_SCHEMA_NAME(B.OBJECT_ID))+"."+QUOTENAME(OBJECT_NAME(B.OBJECT_ID))+" "
        +CASE WHEN A.AVG_FRAGMENTATION_IN_PERCENT>30 THEN "REBUILD" ELSE "REORGANIZE" END 生成SQL语句
FROM sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,NULL) A INNER JOIN sys.indexes B ON A.OBJECT_ID=B.OBJECT_ID AND A.INDEX_ID=B.INDEX_ID
WHERE A.AVG_FRAGMENTATION_IN_PERCENT>5 AND B.INDEX_ID>0
    --AND OBJECT_NAME(B.OBJECT_ID) IN ("INVMB")    --指定表
ORDER BY CASE WHEN A.AVG_FRAGMENTATION_IN_PERCENT>30 THEN N"重新生成索引" ELSE N"重新组织索引" END,OBJECT_NAME(B.OBJECT_ID),B.INDEX_ID

注:将【生成SQL语句】拷贝出来执行即可。

6.2、自动方式

第一步:在服务中启动SQL Server 代理。

SQL Server索引碎片维护进阶[亲测有效]

第二步:点击”管理”->右键”维护计划”->”新建维护计划”。

SQL Server索引碎片维护进阶[亲测有效]

第三步:起个名字,点击”确定”。

SQL Server索引碎片维护进阶[亲测有效]

第四步:点击左侧”工具箱”,将”重新生成索引”及”重新组织索引”拖至右边区域。

SQL Server索引碎片维护进阶[亲测有效]

第五步:分别对着”重新生成索引”及”重新组织索引”点击右键->”编辑”->在”数据库”项勾选要处理的数据库->点击”确定”。

SQL Server索引碎片维护进阶[亲测有效]

第六步:点击”新建作业计划”按钮->设置频率及执行时间->点击”确定”。

SQL Server索引碎片维护进阶[亲测有效]

第七步:点击”保存选定项”即可。

SQL Server索引碎片维护进阶[亲测有效]

七、更新统计信息

作用:UPDATE STATISTICS更新统计信息来提高查询效率。建议放在索引碎片计划任务执行完成之后进行。

查看:查看某个表的统计信息,可以在SSMS下面查看。

SQL Server索引碎片维护进阶[亲测有效]

执行:

--方法一:UPDATE STATISTICS 表名
UPDATE STATISTICS INVMB

--方法二:执行存储过程SP_UPDATESTATS(更新所有表)
EXEC SP_UPDATESTATS

 

后记:建议不要过于频繁地执行重新生成索引、重新组织索引以及更新统计信息。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5833.html

(0)
上一篇 2023-04-22
下一篇 2023-04-23

相关推荐

  • Python代码注释:提高代码可读性的技巧

    Python代码注释:提高代码可读性的技巧a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-01-08
    106
  • sql中聚合函数的用法_MySQL聚合函数

    sql中聚合函数的用法_MySQL聚合函数聚集函数:SQL基本函数,聚集函数对一组值执行计算,并返回单个值,也被称为组函数。聚集函数经常与SELECT语句的GROUP BY子句的HAVING一同使用。但是不可用于WHERE语句中,因为WHER

    2023-04-19
    149
  • Python工程师教你如何新建MongoDB数据库

    Python工程师教你如何新建MongoDB数据库MongoDB是一款开源、高性能、无模式的文档型数据库,主要用于处理非结构化数据。与传统的关系型数据库不同,MongoDB使用BSON(类JSON)格式对数据进行存储,可以快速地存储和查询大量的数据。在本篇文章中,我们将会针对初学者介绍MongoDB,以及如何使用Python的pymongo模块创建MongoDB数据库。

    2024-06-09
    48
  • 物理服务器和虚拟服务器两个有什么区别[亲测有效]

    物理服务器和虚拟服务器两个有什么区别[亲测有效]物理服务器和虚拟服务器两个有什么区别 很多人在选购服务器时会纠结到底是应该选择物理服务器还是虚拟服务器,一方面因为是对两者的概念较为混淆,不清楚其区别与各自优势,另一方面也是没明确好自己的需求。本文…

    2023-02-27
    148
  • mysql 一些常用sql语句[亲测有效]

    mysql 一些常用sql语句[亲测有效]– 修改表注释 ALTER table table_name comment '需要修改注释的信息'; — 修改root 密码 ALTER USER 'root&a…

    2023-02-26
    135
  • ETCD快速入门-01 ETCD概述[通俗易懂]

    ETCD快速入门-01 ETCD概述[通俗易懂]1.ETCD概述 1.1 ETCD概述 etcd是一个高可用的分布式的键值对存储系统,常用做配置共享和服务发现。由CoreOS公司发起的一个开源项目,受到ZooKeeper与doozer启发而催生的项

    2023-05-30
    155
  • 递归查询两种写法的性能差异

    递归查询两种写法的性能差异对于递归查询,KINGBASE用户可以选择使用connect by ,或者使用 with recursive 。下面,我们以例子来看下二者的差别。 一、构造数据 create table test_r

    2023-04-17
    148
  • 以PyCharm设置解释器为中心的使用方法

    以PyCharm设置解释器为中心的使用方法PyCharm是在Python开发者中非常受欢迎的IDE,它具有许多功能强大的工具,使得开发者可以在其中更加高效地进行编码。而在PyCharm中设置解释器非常重要,因为解释器是用于执行Python代码的程序,PyCharm可以帮助用户创建和管理解释器,同时也支持多个解释器的配置。本文将介绍在PyCharm中如何设置解释器,以及如何为不同的项目设置不同的解释器。

    2024-05-20
    72

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注