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维护解决方 ...
随机推荐
- 840. Magic Squares In Grid ——weekly contest 86
题目链接:https://leetcode.com/problems/magic-squares-in-grid/description attention:注意给定的数字不一定是1-9. time: ...
- PAT Saving James Bond - Easy Version
Saving James Bond - Easy Version This time let us consider the situation in the movie "Live and ...
- Oracle初始——第一天
一.数据库分类 1.小型数据库:access.foxbase 2.中型数据库:informix.sql server.mysql 3.大型数据库:sybase.db2.oracle 二.注释 1./* ...
- Java_面向对象三大特征
面向对象特征 面向对象三大特征: 继承, 封装, 多态 继承 继承: 子类可以从父类继承属性和方法 对外公开某些属性和方法 要点(eclipse中Ctrl+T查看继承结构) 1.父类也称超类, 基类, ...
- c#提取
string email = Console.ReadLine(); int atIndex = email.IndexOf('@'); string userName = email.Substri ...
- https中引入http资源资源所导致的问题
问题描述 因为公司要求所有生产环境为了安全性需求,全部都走https, 并且在Nginx里面加入了Content-Security-Policy "upgrade-insecure-requ ...
- 转载:WIFI无线协议802.11a/b/g/n/ac的演变以及区别
WIFI无线协议802.11a/b/g/n/ac的演变以及区别 版权声明:版权所有,转载须注明出处. https://blog.csdn.net/Brouce__Lee/article/details ...
- 使用switch计算出某年某月某日是今年的第几天,输出一直是当月天数
package com.cx.Switch; import java.util.Scanner; /** * 计算出某年某月某日是今年的第几天 * 使用switch */ public class S ...
- Boost.Accumulators累加器的简单使用
Boost.Accumulators是一个累加器,实现的功能很简单,就是对一组数据进行操作,然后可以得到一些特征数据. 由于累加器默认不对数据进行储存操作,所以不能把它作为一个简单的容器使用. 简单使 ...
- 同步FIFO学习笔记