千家信息网

如何理解MYSQL自动重建出现碎片的索引

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,今天就跟大家聊聊有关如何理解MYSQL自动重建出现碎片的索引,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.索引碎片的产生?由于在表里大量的
千家信息网最后更新 2024年11月26日如何理解MYSQL自动重建出现碎片的索引

今天就跟大家聊聊有关如何理解MYSQL自动重建出现碎片的索引,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

1.索引碎片的产生?

由于在表里大量的插入、修改、删除操作而使索引页分裂。如果索引有了高的碎片,有两种情况,一种情况是扫描索引需要花费很多的时间,另一种情况是在查询的时候索引根本不使用索引,都会导致性能降低。

2.碎片类型分为:

2.1 内部破碎

由于索引页里的数据插入或修改操作而发生,以数据作为稀疏矩阵的形式的分布而结束,这将导致数据页的增加,从而增加查询时间。

2.2外部破碎

由于索引/数据页的数据插入或修改而发生,以页码分离和在文件系统里不连贯的新的索引页的分配而结束,数据库服务器不能利用预读操作的优点,因为:下一个相关联的数据页不临近,而且这些相关连的下面的页码可能在数据文件的任何地方。

自动重建发生碎片的索引

在数据中新建碎片整理存储过程

代码如下: -- ================================================-- TEMPLATE GENERATED FROM TEMPLATE EXPLORER USING:-- CREATE PROCEDURE (NEW MENU).SQL---- USE THE SPECIFY VALUES FOR TEMPLATE PARAMETERS -- COMMAND (CTRL-SHIFT-M) TO FILL IN THE PARAMETER -- VALUES BELOW.---- THIS BLOCK OF COMMENTS WILL NOT BE INCLUDED IN-- THE DEFINITION OF THE PROCEDURE.-- ================================================SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- AUTHOR:-- CREATE DATE: -- DESCRIPTION:-- =============================================ALTER PROCEDURE USP_IMS_DEFRAGMENT_INDEXESAS --声明变量SET NOCOUNT ONDECLARE @TABLENAME VARCHAR (128) --表名称(已发生索引碎片)DECLARE @EXECSTR VARCHAR (255) --执行重建索引的语句DECLARE @INDEXNAME CHAR(255) --索引名称DECLARE @DBNAME SYSNAME --数据库名称DECLARE @DBNAMECHAR VARCHAR(20) --数据库名称DECLARE @TABLEIDCHAR VARCHAR(255) --表名称(用于遍历索引碎片)

--检查是否在用户数据库里运行SELECT @DBNAME = DB_NAME()IF @DBNAME IN ('master', 'msdb', 'model', 'tempdb')BEGINPRINT 'THIS PROCEDURE SHOULD NOT BE RUN IN SYSTEM DATABASES.'RETURNEND ELSEBEGINSET @DBNAMECHAR = 'DBNAME'END

--第1阶段:检测碎片--声明游标DECLARE TABLES CURSOR FORSELECT CONVERT(VARCHAR,SO.ID)FROM SYSOBJECTS SOJOIN SYSINDEXES SION SO.ID = SI.IDWHERE SO.TYPE ='U'AND SI.INDID < 2AND SI.ROWS > 0

-- 创建一个临时表来存储碎片信息CREATE TABLE #FRAGLIST (TABLENAME CHAR (255),INDEXNAME CHAR (255))

--打开游标OPEN TABLES

-- 对数据库的所有表循环执行DBCC SHOWCONTIG命令FETCH NEXTFROM TABLESINTO @TABLEIDCHAR

WHILE @@FETCH_STATUS = 0BEGIN--对表的所有索引进行统计INSERT INTO #FRAGLIST

EXEC ('SELECT OBJECT_NAME(DT.OBJECT_ID) AS TABLENAME,SI.NAME AS INDEXNAME FROM '+' (SELECT OBJECT_ID,INDEX_ID,AVG_FRAGMENTATION_IN_PERCENT,AVG_PAGE_SPACE_USED_IN_PERCENT '+' FROM SYS.DM_DB_INDEX_PHYSICAL_STATS(DB_ID('''+@DBNAMECHAR+'''),object_id('''+@TABLEIDCHAR+''')'+',NULL,NULL,''DETAILED'') WHERE INDEX_ID<>0)AS DT INNER JOIN SYS.INDEXES SI'+' ON SI.OBJECT_ID=DT.OBJECT_ID AND SI.INDEX_ID=DT.INDEX_ID AND '+' DT.AVG_FRAGMENTATION_IN_PERCENT>10'+' AND DT.AVG_PAGE_SPACE_USED_IN_PERCENT<75 ORDER BY DT.AVG_FRAGMENTATION_IN_PERCENT DESC')FETCH NEXTFROM TABLESINTO @TABLEIDCHAREND

-- 关闭释放游标CLOSE TABLESDEALLOCATE TABLES

-- 为了检查,报告统计结果SELECT * FROM #FRAGLIST

--第2阶段: (整理碎片) 为每一个要整理碎片的索引声明游标DECLARE INDEXES CURSOR FORSELECT TABLENAME, INDEXNAMEFROM #FRAGLIST -- 输出开始时间SELECT 'STARTED DEFRAGMENTING INDEXES AT ' + CONVERT(VARCHAR,GETDATE())--打开游标OPEN INDEXES--循环所有的索引FETCH NEXTFROM INDEXESINTO @TABLENAME, @INDEXNAMEWHILE @@FETCH_STATUS = 0BEGINSET QUOTED_IDENTIFIER ONSELECT @EXECSTR = 'ALTER INDEX '+@INDEXNAME+' ON'+@TABLENAME+' REBUILD WITH(FILLFACTOR=90,ONLINE=ON)'

SELECT 'Now executing: 'SELECT(@EXECSTR)EXEC (@EXECSTR)SET QUOTED_IDENTIFIER OFFFETCH NEXTFROM INDEXESINTO @TABLENAME, @INDEXNAMEEND-- 关闭释放游标CLOSE INDEXESDEALLOCATE INDEXES

-- 报告结束时间SELECT 'FINISHED DEFRAGMENTING INDEXES AT ' + CONVERT(VARCHAR,GETDATE())

-- 删除临时表DROP TABLE #FRAGLISTGO

GO

设置定时执行步骤

(1)启动【sql server Management Studio】,在【对象资源管理器】窗口里选择【管理】--【维护计划】选项。

(2)右击【维护计划】,在弹出的快捷菜单里选择【维护计划向导】选项,弹出如图所示的【维护计划向导】对话框,单击【下一步】按钮

(3)弹出如图所示【选择目标服务器】对话框,在【名称】文本框里可以输入维护计划的名称;在【说明】文本框里可以输入维护计划的说明文字;【在服务器】文本框里可以输入要使用的服务器名;最后选择正确的身份证信息,单击【下一步】按钮。

(4)弹出如图所示【选择维护任务】对话框,在该对话框中可以选择执行sql维护任务,插入执行存储过程语句

代码如下: USE [DBNAME]

GO

EXEC [dbo].[USP_IMS_DEFRAGMENT_INDEXES]


看完上述内容,你们对如何理解MYSQL自动重建出现碎片的索引有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

索引 碎片 数据 名称 游标 选择 数据库 对话框 时间 服务器 对话 服务 内容 情况 文本 如图 存储 输入 代码 任务 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 java 数据库操作封装 服务器服务管理合同 南京吾爱网络技术第三方 黄浦租房软件开发 常见的非关系型数据库的类型 中学网络文明和网络安全实施方案 移动网络技术支援管理 魏强教授 网络安全宣传周 联想服务器阵列卡 内网服务器如何传输数据 scum服务器自己租的话卡吗 道路空间数据库 成都中专软件开发哪个学校好 软件开发app模型 税务局网络安全承诺书 黔南软件开发培训学校 全国详细地址数据库 服务器报主板电压异常 广州编程软件开发平台 访问数据库的接口和类在哪个包中 广德新能源软件开发服务解决方案 电子商务还是网络技术 大学生如何加强网络安全性 安全生产法规和标准数据库 租个服务器什么意思 联想服务器关机后开机键闪绿灯 思科路由器与网络安全 虹口区企业数据库厂家价格 重庆市委网络安全和信息化 润和软件开发有限公司
0