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

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. 水题挑战4: luogu P1280 尼克的任务

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为 \(n\) 分钟,从 ...

  2. 参悟python元类(又称metaclass)系列实战(一)

    写在前面 之前在看廖雪峰python系列的教程时,对元类的章节一直头大,总在思考我到底适不适合学习python,咋这么难,尤其是ORM的部分,倍受打击:后来从0到1手撸了一套ORM,才稍微进阶了一点理 ...

  3. mysql 两主一从环境搭建(5.7.24)

    搭建说明 两主一从,从本质上说,只不过是机器 master-a 和 master-b 互为主从机(热备),然后通过 keepalived 进行高可用配置,使得在同一时间内只会有一台对外提供服务,实现单 ...

  4. 傲视Kubernetes(一):Kubernetes简介

    前言 从上个月,因工作需要外加兴趣所知,博主开始学习Kubernetes,时至今日可以说是刚刚入门.独自学不如一起学,后面博主会一边学着一边将学习内容以博文的形式呈现出来,希望能跟各位园友有问题一起讨 ...

  5. 典型分布式系统分析:Dynamo

    本文是典型分布式系统分析系列的第四篇,主要介绍 Dynamo,一个在 Amazon 公司内部使用的去中心化的.高可用的分布式 key-value 存储系统. 在典型分布式系统分析系列的第一篇 MapR ...

  6. 找不到package

    在rosrun (前面要有roscore)显示 cannot find the package 只需要一次 永久有效 catkin _ws 是工作空间 rhl@rhl-Lenovo-G480:~$ e ...

  7. 5.MVCC

    5 MVCC ​ 全称是Multi-Version Concurrent Control,即多版本并发控制,在MVCC协议下,每个读操作会看到一个一致性的snapshot,并且可以实现非阻塞的读.MV ...

  8. 内网渗透 day8-linux提权和后门植入

    linux提权和后门植入 目录 1. 脏牛漏洞复现 3 (1) 去网上把代码复制然后touch一个.c文件,vi或者vim打开将代码复制进去保存 3 (2) 进入shell然后从kali开的apach ...

  9. docker生产——容器通信

    简介 在接触docker的第一天起,大家应该就知道:docker容器使用沙箱机制,相互之间没有接口,一般情况下内部访问通过IP+端口.本地容器默认分配的IP极易发生变化,所以靠IP+端口访问的方式缺失 ...

  10. 内核补丁热更新ceph内核模块

    前言 内核模块的更新一般需要卸载模块再加载,但是很多时候使用场景决定了无法做卸载的操作,而linux支持了热更新内核模块的功能,这个已经支持了有一段时间了,一直没有拿ceph的相关模块进行验证 准备工 ...