SQL Server 索引碎片整理
索引碎片整理的四种方法:
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 索引碎片整理的更多相关文章
- SQL Server索引碎片整理实际操作记录
SQL Server 版本是 2008 R2. 查询数据库索引碎片情况的 SQL 语句(来源): SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName, ind ...
- [笔记整理]SQL Server 索引碎片 和 重建索引
铺垫知识点: 数据库存储本身是无序的,建立了聚集索引,会按照聚集索引物理顺序存入硬盘.既键值的逻辑顺序决定了表中相应行的物理顺序 多数情况下,数据库读取频率远高于写入频率,索引的存在 为了读取速度牺牲 ...
- SQL Server 索引碎片产生原理重建索引和重新组织索引
数据库存储本身是无序的,建立了聚集索引,会按照聚集索引物理顺序存入硬盘.既键值的逻辑顺序决定了表中相应行的物理顺序 多数情况下,数据库读取频率远高于写入频率,索引的存在 为了读取速度牺牲写入速度 页 ...
- SQL Server数据库碎片整理
碎片产生 在SQL Server中,存储数据的最小单位是页,每一页所能容纳的数据为8060字节.而页的组织方式是通过B树结构 SQL Server向每个页内存储数据的最小单位是表的行(Row) ...
- 转:sql server索引碎片和解决方法
毫无疑问,给表添加索引是有好处的,你要做的大部分工作就是维护索引,在数据更改期间索引可能产生碎片,所以一些维护是必要的.碎片可能是你查询产生性能问题的来源. 那么到底什么是索引碎片呢?索引碎片实际上有 ...
- sql server 索引碎片相关问题
1.查看表的索引碎片情况 --改成当前库 use DB_Name --创建变量 指定要查看的表 declare @table_id int set @table_id=object_id('Table ...
- SQL SERVER 索引碎片
一次发现同样的SQL在线上库和复制库执行时间差好多,重新创建相关表索引,性能提升明显,怀疑索引有碎片
- SQL Server2005索引碎片分析和解决方法
SQL Server2005索引碎片分析和解决方法 本文作者(郑贤娴),请您在阅读本文时尊重作者版权. 摘要: SQL Server,为了反应数据的更新,需要维护表上的索引,因而这些索引会形成碎片.根 ...
- sql server维护解决方案(备份、检查完整性、索引碎片整理)
请务必看原文 原文:https://ola.hallengren.com/frequently-asked-questions.html 经常问的问题 入门 如何开始使用SQL Server维护解决方 ...
随机推荐
- 水题挑战4: luogu P1280 尼克的任务
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为 \(n\) 分钟,从 ...
- 参悟python元类(又称metaclass)系列实战(一)
写在前面 之前在看廖雪峰python系列的教程时,对元类的章节一直头大,总在思考我到底适不适合学习python,咋这么难,尤其是ORM的部分,倍受打击:后来从0到1手撸了一套ORM,才稍微进阶了一点理 ...
- mysql 两主一从环境搭建(5.7.24)
搭建说明 两主一从,从本质上说,只不过是机器 master-a 和 master-b 互为主从机(热备),然后通过 keepalived 进行高可用配置,使得在同一时间内只会有一台对外提供服务,实现单 ...
- 傲视Kubernetes(一):Kubernetes简介
前言 从上个月,因工作需要外加兴趣所知,博主开始学习Kubernetes,时至今日可以说是刚刚入门.独自学不如一起学,后面博主会一边学着一边将学习内容以博文的形式呈现出来,希望能跟各位园友有问题一起讨 ...
- 典型分布式系统分析:Dynamo
本文是典型分布式系统分析系列的第四篇,主要介绍 Dynamo,一个在 Amazon 公司内部使用的去中心化的.高可用的分布式 key-value 存储系统. 在典型分布式系统分析系列的第一篇 MapR ...
- 找不到package
在rosrun (前面要有roscore)显示 cannot find the package 只需要一次 永久有效 catkin _ws 是工作空间 rhl@rhl-Lenovo-G480:~$ e ...
- 5.MVCC
5 MVCC 全称是Multi-Version Concurrent Control,即多版本并发控制,在MVCC协议下,每个读操作会看到一个一致性的snapshot,并且可以实现非阻塞的读.MV ...
- 内网渗透 day8-linux提权和后门植入
linux提权和后门植入 目录 1. 脏牛漏洞复现 3 (1) 去网上把代码复制然后touch一个.c文件,vi或者vim打开将代码复制进去保存 3 (2) 进入shell然后从kali开的apach ...
- docker生产——容器通信
简介 在接触docker的第一天起,大家应该就知道:docker容器使用沙箱机制,相互之间没有接口,一般情况下内部访问通过IP+端口.本地容器默认分配的IP极易发生变化,所以靠IP+端口访问的方式缺失 ...
- 内核补丁热更新ceph内核模块
前言 内核模块的更新一般需要卸载模块再加载,但是很多时候使用场景决定了无法做卸载的操作,而linux支持了热更新内核模块的功能,这个已经支持了有一段时间了,一直没有拿ceph的相关模块进行验证 准备工 ...