1.索引碎片的产生?

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

2.碎片类型分为:

2.1 内部破碎

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

2.2外部破碎

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

自动重建发生碎片的索引

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

  1. -- ================================================
  2. -- TEMPLATE GENERATED FROM TEMPLATE EXPLORER USING:
  3. -- CREATE PROCEDURE (NEW MENU).SQL
  4. --
  5. -- USE THE SPECIFY VALUES FOR TEMPLATE PARAMETERS
  6. -- COMMAND (CTRL-SHIFT-M) TO FILL IN THE PARAMETER
  7. -- VALUES BELOW.
  8. --
  9. -- THIS BLOCK OF COMMENTS WILL NOT BE INCLUDED IN
  10. -- THE DEFINITION OF THE PROCEDURE.
  11. -- ================================================
  12. SET ANSI_NULLS ON
  13. GO
  14. SET QUOTED_IDENTIFIER ON
  15. GO
  16. -- =============================================
  17. -- AUTHOR:      <AUTHOR,,WUXIANGQIAN>
  18. -- CREATE DATE: <CREATE DATE,2014-05-16>
  19. -- DESCRIPTION: <DESCRIPTION,重建出现碎片的索引>
  20. -- =============================================
  21. ALTER PROCEDURE USP_IMS_DEFRAGMENT_INDEXES
  22. AS
  23. --声明变量
  24. SET NOCOUNT ON
  25. DECLARE @TABLENAME VARCHAR (128) --表名称(已发生索引碎片)
  26. DECLARE @EXECSTR VARCHAR (255) --执行重建索引的语句
  27. DECLARE @INDEXNAME CHAR(255) --索引名称
  28. DECLARE @DBNAME SYSNAME --数据库名称
  29. DECLARE @DBNAMECHAR VARCHAR(20) --数据库名称
  30. DECLARE @TABLEIDCHAR VARCHAR(255) --表名称(用于遍历索引碎片)
  31. --检查是否在用户数据库里运行
  32. SELECT @DBNAME = DB_NAME()
  33. IF @DBNAME IN ('master', 'msdb', 'model', 'tempdb')
  34. BEGIN
  35. PRINT 'THIS PROCEDURE SHOULD NOT BE RUN IN SYSTEM DATABASES.'
  36. RETURN
  37. END ELSE
  38. BEGIN
  39. SET @DBNAMECHAR = 'DBNAME'
  40. END
  41. --第1阶段:检测碎片
  42. --声明游标
  43. DECLARE TABLES CURSOR FOR
  44. SELECT CONVERT(VARCHAR,SO.ID)
  45. FROM SYSOBJECTS SO
  46. JOIN SYSINDEXES SI
  47. ON SO.ID = SI.ID
  48. WHERE SO.TYPE ='U'
  49. AND SI.INDID < 2
  50. AND SI.ROWS > 0
  51. -- 创建一个临时表来存储碎片信息
  52. CREATE TABLE #FRAGLIST (
  53. TABLENAME CHAR (255),
  54. INDEXNAME CHAR (255))
  55. --打开游标
  56. OPEN TABLES
  57. -- 对数据库的所有表循环执行DBCC SHOWCONTIG命令
  58. FETCH NEXT
  59. FROM TABLES
  60. INTO @TABLEIDCHAR
  61. WHILE @@FETCH_STATUS = 0
  62. BEGIN
  63. --对表的所有索引进行统计
  64. INSERT INTO #FRAGLIST
  65. EXEC ('SELECT OBJECT_NAME(DT.OBJECT_ID) AS TABLENAME,SI.NAME AS INDEXNAME FROM '+
  66. ' (SELECT OBJECT_ID,INDEX_ID,AVG_FRAGMENTATION_IN_PERCENT,AVG_PAGE_SPACE_USED_IN_PERCENT '+
  67. ' FROM SYS.DM_DB_INDEX_PHYSICAL_STATS(DB_ID('''+@DBNAMECHAR+'''),object_id('''+@TABLEIDCHAR+''')'+
  68. ',NULL,NULL,''DETAILED'') WHERE INDEX_ID<>0)AS DT INNER JOIN SYS.INDEXES SI'+
  69. ' ON SI.OBJECT_ID=DT.OBJECT_ID AND SI.INDEX_ID=DT.INDEX_ID AND '+
  70. ' DT.AVG_FRAGMENTATION_IN_PERCENT>10'+
  71. ' AND DT.AVG_PAGE_SPACE_USED_IN_PERCENT<75 ORDER BY DT.AVG_FRAGMENTATION_IN_PERCENT DESC')
  72. FETCH NEXT
  73. FROM TABLES
  74. INTO @TABLEIDCHAR
  75. END
  76. -- 关闭释放游标
  77. CLOSE TABLES
  78. DEALLOCATE TABLES
  79. -- 为了检查,报告统计结果
  80. SELECT * FROM #FRAGLIST
  81. --第2阶段: (整理碎片) 为每一个要整理碎片的索引声明游标
  82. DECLARE INDEXES CURSOR FOR
  83. SELECT TABLENAME, INDEXNAME
  84. FROM #FRAGLIST
  85. -- 输出开始时间
  86. SELECT 'STARTED DEFRAGMENTING INDEXES AT ' + CONVERT(VARCHAR,GETDATE())
  87. --打开游标
  88. OPEN INDEXES
  89. --循环所有的索引
  90. FETCH NEXT
  91. FROM INDEXES
  92. INTO @TABLENAME, @INDEXNAME
  93. WHILE @@FETCH_STATUS = 0
  94. BEGIN
  95. SET QUOTED_IDENTIFIER ON
  96. SELECT @EXECSTR = 'ALTER INDEX '+@INDEXNAME+' ON    '+@TABLENAME+' REBUILD WITH(FILLFACTOR=90,ONLINE=ON)'
  97. SELECT 'Now executing: '
  98. SELECT(@EXECSTR)
  99. EXEC (@EXECSTR)
  100. SET QUOTED_IDENTIFIER OFF
  101. FETCH NEXT
  102. FROM INDEXES
  103. INTO @TABLENAME, @INDEXNAME
  104. END
  105. -- 关闭释放游标
  106. CLOSE INDEXES
  107. DEALLOCATE INDEXES
  108. -- 报告结束时间
  109. SELECT 'FINISHED DEFRAGMENTING INDEXES AT ' + CONVERT(VARCHAR,GETDATE())
  110. -- 删除临时表
  111. DROP TABLE #FRAGLIST
  112. GO
  113. GO

设置定时执行步骤

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

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

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

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

  1. USE [DBNAME]
  2. GO
  3. EXEC [dbo].[USP_IMS_DEFRAGMENT_INDEXES]

(5)指定任务执行计划

SQL Server 自动重建出现碎片的索引的更多相关文章

  1. SQL SERVER 自动生成 MySQL 表结构及索引 的建表SQL

          SQL SERVER的表结构及索引转换为MySQL的表结构及索引,其实在很多第三方工具中有提供,比如navicat.sqlyog等,但是,在处理某些数据类型.默认值及索引转换的时候,总有些 ...

  2. SQL Server 2005 中的分区表和索引

    SQL Server 2005 中的分区表和索引 SQL Server 2005          69(共 83)对本文的评价是有帮助 - 评价此主题   发布日期 : 3/24/2005 | 更新 ...

  3. SQL Server 性能调优2 之索引(Index)的建立

    前言 索引是关系数据库中最重要的对象之中的一个,他能显著降低磁盘I/O及逻辑读取的消耗,并以此来提升 SELECT 语句的查找性能.但它是一把双刃剑.使用不当反而会影响性能:他须要额外的空间来存放这些 ...

  4. SQL Server 2016:内存列存储索引

    作者 Jonathan Allen,译者 谢丽 SQL Server 2016的一项新特性是可以在“内存优化表(Memory Optimized Table)”上添加“列存储索引(Columnstor ...

  5. SQL Server ->> ColumnStore Index(列存储索引)

    Columnstored index是SQL Server 2012后加入的重大特性,数据不再以heap或者B Tree的形式存储(row level)存储在每一个数据库文件的页里面,而是以列为单位存 ...

  6. 【SQL】用Sql Server自动生产html格式的数据字典

    原文:[SQL]用Sql Server自动生产html格式的数据字典 本文软件环境:Sql Server 2008. 1.打开sql server管理器,给选定的表添加描述信息,给指定的字段添加描述信 ...

  7. SQL Server的唯一键和唯一索引会将空值(NULL)也算作重复值

    我们先在SQL Server数据库中,建立一张Students表: CREATE TABLE [dbo].[Students]( ,) NOT NULL, ) NULL, ) NULL, [Age] ...

  8. 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题

    原文:[Transact-SQL]SQL Server自动把left join自动转化为inner join.以及关联时的数据重复问题 1.SQL Server自动把left join自动转化为inn ...

  9. SQL Server性能优化(14)索引碎片

    一. 外部碎片和内部碎片的概念 碎片的概念和检测,参考MSDN:https://msdn.microsoft.com/zh-cn/library/ms189858.aspx 二.对于碎片的解决办法 解 ...

随机推荐

  1. pythonl练习笔记——threading创建进程锁Lock()

    1 基本概述 采用threading.Lock()对象创建锁lock,即 lock = threading.Lock() 其相关方法主要有 lock.acquire() # lock the lock ...

  2. JMeter学习笔记---性能分析

    图像结果: 通过观察平均采样响应时长,用户可以直观地看到,随着并发压力的加大,以及性能测试时间的延长,系统性能所发生的变化.正常情况下,平均采样响应时长曲线应该是平滑的,并大致平行于图像下边界. 异常 ...

  3. 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  4. Memcached Windows 测试

    一.安装 打开CMD 到memcached根目录 1.安装 memcached.exe –d install 2.启动 memcached.exe -d start 经实验使用命令修改端口无效,相应的 ...

  5. nginx php-fpm 输出php错误日志(转)

    nginx是一个web服务器,因此nginx的access日志只有对访问页面的记录,不会有php 的 error log信息. nginx把对php的请求发给php-fpm fastcgi进程来处理, ...

  6. nginx服务器下 PHP 出现 502 解决方案(转)

    nginx出现502有很多原因,但大部分原因可以归结为资源数量不够用,也就是说后端PHP-fpm处理有问题,nginx将正确的客户端请求发给了后端的php-fpm进程,但是因为php-fpm进程的问题 ...

  7. 使用命令行工具mysqlimport导入数据

    Usage: mysqlimport [OPTIONS] database textfile ... mysqlimport 程序是一个将以特定格式存放的文本数据(如通过“select * into ...

  8. "DISTINCT" make huge difference

    继上一篇提到的UNION/UNION ALL会影响执行计划,再次碰到一个类似的问题.一个SQL加了DISTINCT跟不加DISTINCT的执行计划完全不同,导致执行时间差了好多倍. 原始的SQL如下所 ...

  9. php利用phpexcel导出数据

    php中利用phpexcel导出数据的实现代码.对phpexcel类库不熟悉的朋友,可以阅读下<phpexcel中文帮助手册>中的内容,具体实例大家可以phpexcel快速开发指南中的相关 ...

  10. 【Anroid】9.1 ListView相关类及其适配器

    分类:C#.Android.VS2015: 创建日期:2016-02-18 一.简介 列表视图(ListView)是Android应用程序中使用最频繁的UI组件,从无处不在短菜单选项列表到冗长的联系人 ...