SQL Server 自动重建出现碎片的索引
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 ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- -- =============================================
- -- AUTHOR: <AUTHOR,,WUXIANGQIAN>
- -- CREATE DATE: <CREATE DATE,2014-05-16>
- -- DESCRIPTION: <DESCRIPTION,重建出现碎片的索引>
- -- =============================================
- ALTER PROCEDURE USP_IMS_DEFRAGMENT_INDEXES
- AS
- --声明变量
- SET NOCOUNT ON
- DECLARE @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')
- BEGIN
- PRINT 'THIS PROCEDURE SHOULD NOT BE RUN IN SYSTEM DATABASES.'
- RETURN
- END ELSE
- BEGIN
- SET @DBNAMECHAR = 'DBNAME'
- END
- --第1阶段:检测碎片
- --声明游标
- DECLARE TABLES CURSOR FOR
- SELECT CONVERT(VARCHAR,SO.ID)
- FROM SYSOBJECTS SO
- JOIN SYSINDEXES SI
- ON SO.ID = SI.ID
- WHERE SO.TYPE ='U'
- AND SI.INDID < 2
- AND SI.ROWS > 0
- -- 创建一个临时表来存储碎片信息
- CREATE TABLE #FRAGLIST (
- TABLENAME CHAR (255),
- INDEXNAME CHAR (255))
- --打开游标
- OPEN TABLES
- -- 对数据库的所有表循环执行DBCC SHOWCONTIG命令
- FETCH NEXT
- FROM TABLES
- INTO @TABLEIDCHAR
- WHILE @@FETCH_STATUS = 0
- BEGIN
- --对表的所有索引进行统计
- 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 NEXT
- FROM TABLES
- INTO @TABLEIDCHAR
- END
- -- 关闭释放游标
- CLOSE TABLES
- DEALLOCATE TABLES
- -- 为了检查,报告统计结果
- SELECT * FROM #FRAGLIST
- --第2阶段: (整理碎片) 为每一个要整理碎片的索引声明游标
- DECLARE INDEXES CURSOR FOR
- SELECT TABLENAME, INDEXNAME
- FROM #FRAGLIST
- -- 输出开始时间
- SELECT 'STARTED DEFRAGMENTING INDEXES AT ' + CONVERT(VARCHAR,GETDATE())
- --打开游标
- OPEN INDEXES
- --循环所有的索引
- FETCH NEXT
- FROM INDEXES
- INTO @TABLENAME, @INDEXNAME
- WHILE @@FETCH_STATUS = 0
- BEGIN
- SET QUOTED_IDENTIFIER ON
- SELECT @EXECSTR = 'ALTER INDEX '+@INDEXNAME+' ON '+@TABLENAME+' REBUILD WITH(FILLFACTOR=90,ONLINE=ON)'
- SELECT 'Now executing: '
- SELECT(@EXECSTR)
- EXEC (@EXECSTR)
- SET QUOTED_IDENTIFIER OFF
- FETCH NEXT
- FROM INDEXES
- INTO @TABLENAME, @INDEXNAME
- END
- -- 关闭释放游标
- CLOSE INDEXES
- DEALLOCATE INDEXES
- -- 报告结束时间
- SELECT 'FINISHED DEFRAGMENTING INDEXES AT ' + CONVERT(VARCHAR,GETDATE())
- -- 删除临时表
- DROP TABLE #FRAGLIST
- GO
- GO
设置定时执行步骤
(1)启动【sql server Management Studio】,在【对象资源管理器】窗口里选择【管理】——【维护计划】选项。
(2)右击【维护计划】,在弹出的快捷菜单里选择【维护计划向导】选项,弹出如图所示的【维护计划向导】对话框,单击【下一步】按钮
(3)弹出如图所示【选择目标服务器】对话框,在【名称】文本框里可以输入维护计划的名称;在【说明】文本框里可以输入维护计划的说明文字;【在服务器】文本框里可以输入要使用的服务器名;最后选择正确的身份证信息,单击【下一步】按钮。
(4)弹出如图所示【选择维护任务】对话框,在该对话框中可以选择执行sql维护任务,插入执行存储过程语句
- USE [DBNAME]
- GO
- EXEC [dbo].[USP_IMS_DEFRAGMENT_INDEXES]
(5)指定任务执行计划
SQL Server 自动重建出现碎片的索引的更多相关文章
- SQL SERVER 自动生成 MySQL 表结构及索引 的建表SQL
SQL SERVER的表结构及索引转换为MySQL的表结构及索引,其实在很多第三方工具中有提供,比如navicat.sqlyog等,但是,在处理某些数据类型.默认值及索引转换的时候,总有些 ...
- SQL Server 2005 中的分区表和索引
SQL Server 2005 中的分区表和索引 SQL Server 2005 69(共 83)对本文的评价是有帮助 - 评价此主题 发布日期 : 3/24/2005 | 更新 ...
- SQL Server 性能调优2 之索引(Index)的建立
前言 索引是关系数据库中最重要的对象之中的一个,他能显著降低磁盘I/O及逻辑读取的消耗,并以此来提升 SELECT 语句的查找性能.但它是一把双刃剑.使用不当反而会影响性能:他须要额外的空间来存放这些 ...
- SQL Server 2016:内存列存储索引
作者 Jonathan Allen,译者 谢丽 SQL Server 2016的一项新特性是可以在“内存优化表(Memory Optimized Table)”上添加“列存储索引(Columnstor ...
- SQL Server ->> ColumnStore Index(列存储索引)
Columnstored index是SQL Server 2012后加入的重大特性,数据不再以heap或者B Tree的形式存储(row level)存储在每一个数据库文件的页里面,而是以列为单位存 ...
- 【SQL】用Sql Server自动生产html格式的数据字典
原文:[SQL]用Sql Server自动生产html格式的数据字典 本文软件环境:Sql Server 2008. 1.打开sql server管理器,给选定的表添加描述信息,给指定的字段添加描述信 ...
- SQL Server的唯一键和唯一索引会将空值(NULL)也算作重复值
我们先在SQL Server数据库中,建立一张Students表: CREATE TABLE [dbo].[Students]( ,) NOT NULL, ) NULL, ) NULL, [Age] ...
- 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题
原文:[Transact-SQL]SQL Server自动把left join自动转化为inner join.以及关联时的数据重复问题 1.SQL Server自动把left join自动转化为inn ...
- SQL Server性能优化(14)索引碎片
一. 外部碎片和内部碎片的概念 碎片的概念和检测,参考MSDN:https://msdn.microsoft.com/zh-cn/library/ms189858.aspx 二.对于碎片的解决办法 解 ...
随机推荐
- python学习笔记012——locals与globals
1 定义 globals() 功能:收集全局变量参数:无返回值:得到一个收集全局变量的字典(会包含系统的内置变量) locals() 功能:收集局部变量参数:无返回值:得到一个收集局部变量的字典 a ...
- 转 生成 HTMLTestRunner 测试报告
转自:http://www.cnblogs.com/hero-blog/p/4128575.html 04.生成 HTMLTestRunner 测试报告 1.HTMLTestRunner 是 P ...
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
在前面的系列网络编程文章中,我们都是使用socket 自己实现客户端和服务器端来互相发数据测试,现在尝试使用socket 客户端发 送http 请求给某个网站,然后接收网站的响应数据.http 协议参 ...
- Java中的static关键字的用法
1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法. (2 ...
- javascript限定输入textarea输入长度
<textarea id="content" onkeyup="limitLength(this.value,'512','content')"> ...
- angular.js ng-repeat动态插入删除dom节点
既然上面提到 angular.js 下无需用户直接操作dom ,而是在编译间断 dom 与 控制层model 实现了双向绑定,一方做出改变,另一方就会立即改变,那问题来了,我想插入一个文本框和按钮,并 ...
- 2015小米暑期实习笔试题_风口的猪-中国牛市(dp)
风口之下.猪都能飞.当今中国股市牛市,真可谓"错过等七年". 给你一个回想历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i] ...
- Linux上添加新硬盘的实例介绍
在Linux上添加新硬盘的实例讲解,有需要的朋友可以看看. 系统:Redhat AS3 UP3硬盘:scsi注意:# 表示是root用户执行的命令 [root@cncmail data1]# fdis ...
- mysql常用函数汇总(分享)
以下是对mysql中的常用函数进行了汇总介绍.需要的朋友可以过来参考下. 一.数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x ...
- [na]诺顿ghost磁盘对刻(备份系统分区或数据分区)
一 诺顿ghost简介 ,可以克隆分区 也可以克隆磁盘 ,克隆成img或磁盘内容对刻 ,磁盘分区--img---磁盘分区 磁盘---磁盘 二 操作步骤 对刻好的系统 整体思路: ,A是模板机,A有C ...