索引碎片整理的四种方法:

1)删除索引并重建

2)使用 DROP_EXISTING 语句重建索引

3)使用 ALTER INDEX REBUILD 语句重建索引

4)使用 ALTER INDEX REORGANIZE 重新组织索引

--1.查看碎片
SELECT DB_NAME() AS DatbaseName ,
SCHEMA_NAME(o.Schema_ID) AS SchemaName ,
OBJECT_NAME(s.[object_id]) AS TableName ,
i.name AS IndexName ,
ROUND(s.avg_fragmentation_in_percent, 2) AS [Fragmentation %] ,
CASE WHEN avg_fragmentation_in_percent > 30 THEN '严重碎片,索引需要重建'
WHEN avg_fragmentation_in_percent >= 5
AND avg_fragmentation_in_percent < 30 THEN '轻度碎片,索引需要重新组织'
ELSE '正常状态'
END 提示
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
ORDER BY [Fragmentation %] DESC --2.整理碎片(建议在空闲时间运行,尤其不要在生产环境运行)
SET NOCOUNT ON
DECLARE @Objectid INT ,
@Indexid INT ,
@schemaname VARCHAR(100) ,
@tablename VARCHAR(300) ,
@ixname VARCHAR(500) ,
@avg_fip FLOAT ,
@command VARCHAR(4000)
DECLARE IX_Cursor CURSOR
FOR
SELECT A.object_id ,
A.index_id ,
QUOTENAME(SS.NAME) AS schemaname ,
QUOTENAME(OBJECT_NAME(B.object_id, B.database_id)) AS tablename ,
QUOTENAME(A.name) AS ixname ,
B.avg_fragmentation_in_percent AS avg_fip
FROM sys.indexes A
INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL,
NULL, 'LIMITED') AS B ON A.object_id = B.object_id
AND A.index_id = B.index_id
INNER JOIN SYS.OBJECTS OS ON A.object_id = OS.object_id
INNER JOIN sys.schemas SS ON OS.schema_id = SS.schema_id
WHERE B.avg_fragmentation_in_percent > 10
AND B.page_count > 20
AND A.index_id > 0
AND A.IS_DISABLED <> 1
--AND OS.name='book'
ORDER BY avg_fip DESC ,
tablename ,
ixname
OPEN IX_Cursor
FETCH NEXT FROM IX_Cursor INTO @Objectid, @Indexid, @schemaname, @tablename,
@ixname, @avg_fip
WHILE @@FETCH_STATUS = 0
BEGIN
--碎片率>5%或<=30%,索引重组
IF @avg_fip < 30.0
SET @command = N'ALTER INDEX ' + @ixname + N' ON ' + @schemaname
+ N'.' + @tablename + N' REORGANIZE '; --碎片率>=30%,索引重建
IF @avg_fip >= 30.0
AND @Indexid = 1
BEGIN
IF EXISTS ( SELECT *
FROM SYS.columns
WHERE OBJECT_ID = @Objectid
AND max_length IN ( -1, 16 ) )
SET @command = N'ALTER INDEX ' + @ixname + N' ON '
+ @schemaname + N'.' + @tablename + N' REBUILD ';
ELSE
SET @command = N'ALTER INDEX ' + @ixname + N' ON '
+ @schemaname + N'.' + @tablename + N' REBUILD '
+ N' WITH (ONLINE = ON)';
END
IF @avg_fip >= 30.0
AND @Indexid > 1
BEGIN
IF EXISTS ( SELECT *
FROM SYS.index_columns IC
INNER JOIN SYS.columns CS ON CS.OBJECT_ID = IC.OBJECT_ID
AND CS.column_id = IC.column_id
WHERE IC.OBJECT_ID = @Objectid
AND IC.index_id = @Indexid
AND CS.max_length IN ( -1, 16 ) )
SET @command = N'ALTER INDEX ' + @ixname + N' ON '
+ @schemaname + N'.' + @tablename + N' REBUILD ';
ELSE
SET @command = N'ALTER INDEX ' + @ixname + N' ON '
+ @schemaname + N'.' + @tablename + N' REBUILD '
+ N' WITH (ONLINE = ON)';
END
--打印命令,单独执行
PRINT @command --直接执行命令
--EXEC(@command) FETCH NEXT FROM IX_Cursor INTO @Objectid, @Indexid, @schemaname,@tablename, @ixname, @avg_fip
END
CLOSE IX_Cursor
DEALLOCATE IX_Cursor

SQL Server 索引碎片整理的更多相关文章

  1. SQL Server索引碎片整理实际操作记录

    SQL Server 版本是 2008 R2. 查询数据库索引碎片情况的 SQL 语句(来源): SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName, ind ...

  2. [笔记整理]SQL Server 索引碎片 和 重建索引

    铺垫知识点: 数据库存储本身是无序的,建立了聚集索引,会按照聚集索引物理顺序存入硬盘.既键值的逻辑顺序决定了表中相应行的物理顺序 多数情况下,数据库读取频率远高于写入频率,索引的存在 为了读取速度牺牲 ...

  3. SQL Server 索引碎片产生原理重建索引和重新组织索引

    数据库存储本身是无序的,建立了聚集索引,会按照聚集索引物理顺序存入硬盘.既键值的逻辑顺序决定了表中相应行的物理顺序 多数情况下,数据库读取频率远高于写入频率,索引的存在 为了读取速度牺牲写入速度 页 ...

  4. SQL Server数据库碎片整理

    碎片产生   在SQL Server中,存储数据的最小单位是页,每一页所能容纳的数据为8060字节.而页的组织方式是通过B树结构  SQL Server向每个页内存储数据的最小单位是表的行(Row)  ...

  5. 转:sql server索引碎片和解决方法

    毫无疑问,给表添加索引是有好处的,你要做的大部分工作就是维护索引,在数据更改期间索引可能产生碎片,所以一些维护是必要的.碎片可能是你查询产生性能问题的来源. 那么到底什么是索引碎片呢?索引碎片实际上有 ...

  6. sql server 索引碎片相关问题

    1.查看表的索引碎片情况 --改成当前库 use DB_Name --创建变量 指定要查看的表 declare @table_id int set @table_id=object_id('Table ...

  7. SQL SERVER 索引碎片

    一次发现同样的SQL在线上库和复制库执行时间差好多,重新创建相关表索引,性能提升明显,怀疑索引有碎片

  8. SQL Server2005索引碎片分析和解决方法

    SQL Server2005索引碎片分析和解决方法 本文作者(郑贤娴),请您在阅读本文时尊重作者版权. 摘要: SQL Server,为了反应数据的更新,需要维护表上的索引,因而这些索引会形成碎片.根 ...

  9. sql server维护解决方案(备份、检查完整性、索引碎片整理)

    请务必看原文 原文:https://ola.hallengren.com/frequently-asked-questions.html 经常问的问题 入门 如何开始使用SQL Server维护解决方 ...

随机推荐

  1. 聊聊Go代码覆盖率技术与最佳实践

    "聊点干货" 覆盖率技术基础 截止到Go1.15.2以前,关于覆盖率技术底层实现,以下知识点您应该知道: go语言采用的是插桩源码的形式,而不是待二进制执行时再去设置breakpo ...

  2. 18、Celery

    Celery 1.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组 ...

  3. 解决Python参考文档乱码问题

    问题如下: 解决方案: 打开IE浏览器,随便输入一个网址,在页面空白处点击右键->编码->自动选择 再次重新开启python3 帮助文档即可

  4. 想更改Github仓库中的某个文件结构

    虽然有各种版本回退啥的,可是感觉好麻烦,还是没搞来,后来发现可以直接先删除,然后在本地更改,更改完之后重新添加一次即可 删除远程库的某个文件: $ git pull origin master 将远程 ...

  5. 数字取证autopsy系列——保存证据镜像(一)

    简介: 在学习autopsy之前,我们先学习如何将犯罪嫌疑人的磁盘保存为一个证据镜像.我们使用的将磁盘保存为证据镜像的工具为AccessData FTK imager,你可以自行搜索下载. Acces ...

  6. [MIT6.006] 8. Hashing with Chaining 散列表

    一.字典 在之前课里,如果我们要实现插入,删除和查找,使用树结构,最好的时间复杂度是AVL下的Ο(log2n),使用线性结构,最好的复杂度为基数排序Ο(n).但如果使用字典数据类型去做,时间复杂度可为 ...

  7. 主动关闭 time-wait 2msl 处理

    先上传后面整理 /* * This routine is called by the ICMP module when it gets some * sort of error condition. ...

  8. mysql 触发器的创建和使用

    什么是触发器 触发器(TRIGGER)是MySQL的数据库对象之一,从5.0.2版本开始支持.该对象与编程语言中的函数非常类似,都需要声明.执行等.但是触发器的执行不是由程序调用,也不是由手工启动,而 ...

  9. SpringBoot微服务框架

    springboot 是什么? 配置如何编写 yaml 自动装配原理 集成Web开发 集成数据库Druid 分布式开发:Dubbo(RPC)+zookeeper swagger:接口文档 任务调度 S ...

  10. maven pom.xml 报错

    首先介绍背景,在eclipse中导入一个maven的项目,在我之前的电脑上导入好用,在自己的电脑上导入居然pom报错了Missing artifact junit:junit:jar:4.11,还会有 ...