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维护解决方 ...
随机推荐
- [Luogu P2261] [CQOI2007]余数求和 (取模计算)
题面 传送门:https://www.luogu.org/problemnew/show/P2261 Solution 这题显然有一个O(n)的直接计算法,60分到手. 接下来我们就可以拿出草稿纸推一 ...
- shp文件转dwg并创建文本标注
不得不说,ArcGIS 和 CAD 之间的兼容性非常差,shapefile文件和dwg文件之间互相转换会丢失各种属性,但是很多时候他们之间的转换对我们来说是刚需.通常我们都是通过第三方软件(如FME) ...
- Python调用Java(基于Ubuntu 18.04)
最近实习,需要使用Python编程,其中牵涉到一些算法的编写.由于不熟悉Python,又懒得从头学,而且要写的算法自己之前又用Java实现过,就想着能不能用Python调用Java.经过查找资料,方法 ...
- Pycharm激活码(2020最新永久激活码)
如果下边的Pycharm激活码过期失效了的话,大家可以关注我的微信公众号:Python联盟,然后回复"激活码"即可获取最新Pycharm永久激活码! 56NPDDVEIV-eyJs ...
- go-zero 如何扛住流量冲击(一)
不管是在单体服务中还是在微服务中,开发者为前端提供的API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性.即接口也需要安装上保险丝,以 ...
- [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1076)'))) - skipping
C:\Users>pip listPackage Version------------ -------behave 1.2.6configparser 3.7.4ddt 1.2.1parse ...
- threading中的其他部分方法
import threading def wahaha(n): print(n, threading.current_thread()) # 1 <Thread(Thread-1, starte ...
- python文件操作与编解码
1 # 文件操作 2 3 ''' 4 1.文件路径:要知道文件的路径 5 6 2.编码方式:要知道文件是什么编码的.utf-8 gbk...... 7 8 3.操作方式:要以什么样的方式进行打开这个文 ...
- js前端读取文件内容
方法1:原生 <input type="file" name="file" id="file" onchange="jsRe ...
- 面试必看!凭借着这份 MySQL 高频面试题,我拿到了京东,字节的offer!
前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面 ...