SQL SEVER碎片化及压缩整理

SQL Server数据库索引的碎片整理:最佳实践指南 在SQL Server的维护工作中,索引碎片整理是一项至关重要的任务。本文将深入探讨SQL Server中数据库索引碎片整理的最佳实践,通过详细的步骤和示例代码,帮助你高效地维护索引的完整性和性能。通过本文的详细介绍,你应该已经了解了如何检测索引碎片化程度以及如何根据情况选择合适的整理策略。在整理索引碎片之前,首先需要检测索引的碎片化程度。:对于不同类型的索引(如聚集索引和非聚集索引),采取不同的维护策略。:根据索引的大小和碎片化程度选择合适的整理策略。:定期执行索引碎片整理,避免碎片化程度过高。 阅读详情

对于有聚集索引的表,如果存在碎片。
(1)索引重新组织
(2)索引重新生成


对于堆,如果存在碎片。
(1)将数据插入临时表,Truancate,再insert 
(2)在表中创建聚集索引后,再删除聚集索引,因为创建聚集索引会重新分布数据,这种分布一般是最优的。
如果表中存在非聚集索引,需要在drop 聚集索引后重新生成所有非聚集索引。

对于索引的碎片处理。
(1)索引重新组织
(2)索引重新生成

在碎片清理的基础上,还可以通过压缩(表压缩、索引压缩、分区压缩),提高I/O。
但是压缩是牺牲CPU来换取I/O。

表压缩(聚集索引会继承表压缩,非聚集索引不会继承),分为行压缩和页压缩
(1)需要频繁更新的对象应该使用行压缩。
(2)只是执行读取操作的应该使用页压缩。
  
  行压缩:对字段类型进行压缩,如INT,默认4个字节,如填写的1,会压缩成1个字节。
如Char(500),默认分配500个字符,没有写满会用空字符填充,压缩会将这些空字符去掉。
  
 页压缩主要是 前缀压缩和字典压缩
 前缀压缩:对于一页中的每一行,提取前缀,将数据值有前缀代替。 如提取的前缀为AABB,数据值为AABBCC,替换后4CC。 数据值为CDBE,替换后为0CDBE 。不要求每行的每一列都包括了前缀。
 字典压缩:在前缀压缩的基础之上,是对一页中重复值,抽取出来,替换。


压缩适合场景:
1.CPU充足,I/O瓶颈或存储空间步骤
2.表字段存在大量定长字段
3.表中存在大量空数据
4.表中存在大量重复数据


表压缩是不能减少碎片,只是在原有数据将数据进行压缩,腾出一定程度的空间,减少存储的页和区。但是先前的碎片仍然存在。

分析碎片常使用脚本 :


-------------------查看表的分区信息-------------------------------
CREATE PROCEDURE SP_ExtentInfo  
AS  
        DBCC ExtentInfo(0)  
GO  


  --创建保存分区信息的临时表  
        Create Table #ExtentInfo  
        (  
                fileid smallint,  
                pageid int,  
                pg_alloc int,  
                ext_size int,  
                obj_id int,  
                index_id int,  
                partition_number int,  
                partition_id bigint,  
                iam_chain_type varchar(50),  
                pfs_bytes varbinary(10)  
        )  
        insert into #ExtentInfo exec SP_ExtentInfo  


   --显示当前分区信息  
        select fileid,obj_id,index_id,partition_id,ext_size,  
                object_name(obj_id) as '对象名',  
                count(*) as '实际区数', sum(pg_alloc) as '实际页数',  
                ceiling(sum(pg_alloc)*1.00/ext_size)*ext_size as '最大可用页数',  
                ceiling(sum(pg_alloc)*1.00/ext_size*100.00/count(*)) as '表空间使用比率'  
        from ExtentInfo  
        group by fileid,obj_id,index_id,partition_id,ext_size  
        order by partition_id,obj_id,index_id,fileid  
          


----------------------------查看表碎片------------------------
   DBCC SHOWCONTIG  ('GPSMonitorLog')   
   
   SET STATISTICS IO on
   SET STATISTICS time  on
   select * from GPSMonitorLog


----------------------------查看索引碎片--------------------------
--查看索引碎片使用sys.dm_db_index_physical_stats(DB_ID(),@objectid,@indexid,NULL,'limited'),以下为查看整个数据库索引碎片。
--考虑到效率问题,没有直接用JOIN,而是用的游标,


IF EXISTS  (select  OBJECT_ID('#temp1') )   drop  table #temp1 
Create table  #temp1
(
 objectID   INT , 
 indexid  INT,
 partition_number  INT,
 index_type_desc varchar(50) ,
 alloc_unit_type_desc varchar(50),
 index_depth  INT  ,
 index_level INT ,
 avg_fragmentation_in_percent Decimal(10,2) ,
 fragment_count INT  ,
  avg_fragment_size_in_pages Decimal(10,2)
)
declare @objectid  int 
declare @indexid int , @n int =1 


declare   obj_cur  cursor for 
select a.object_id ,b.index_id    from  sys.objects a
join   sys.indexes  b on  a.object_id=b.object_id 
where a.type  = 'U'
and b.type  >0 --排除堆 为1表示聚集索引,为2表示非聚集索引


 open obj_cur  
 fetch next from obj_cur into @objectid  ,@indexid
 while (@@FETCH_STATUS =0)
 begin 
 
 INSERT INTO #temp1
 select  object_ID   , 
 index_id ,
 partition_number ,
 index_type_desc ,
 alloc_unit_type_desc ,
 index_depth ,
 index_level,
 avg_fragmentation_in_percent ,
 fragment_count,
 avg_fragment_size_in_pages 
 from   sys.dm_db_index_physical_stats(DB_ID(),@objectid,@indexid,NULL,'limited')
 fetch next from obj_cur into @objectid  ,@indexid
 print (@n ) 
 set @n = @n +1  
 end 
close obj_cur
deallocate obj_cur


select b.name , c.name ,a.*  from #temp1 a
join   sys.objects b on  a.objectID=b.object_id 
join   sys.indexes  c on  a.indexid=c.index_id  and b.object_id =c.object_id
where  avg_fragmentation_in_percent >30  --碎片比大于30% 

SQL Server表空间碎片化回收 1 锁片化的产生 1.1 产生碎片化的原因 1、在B-tree索引中,表数据按照聚集索引的排序进行物理存储,若聚集索引离散化比较严重,那么可能会出现较为严重的碎片化问题; 2、随着业务的DML操作,会伴随着数据页分裂的情况,这种情况下也会导致表空间碎片化问题; 3、大表通过delete清理无效历史数据,delete产生碎片化空间; 1.2 碎片化的影响 表空间碎片化越严重越容易影响对该表的查询效率,这是因为当表碎片化比较严重时,数据库根据执行计划扫描满足需求的数据页会扫描较多“无效页面”,导致查询操作需要更 阅读详情

相关推荐

【MSSQL】sql server怎样整理某个表的碎片

碎片化是指数据在物理存储上不连续,导致数据库无法有效利用存储空间。碎片化通常分为两种类型:内部碎片:数据页中存在空闲空间,没有被有效利用。外部碎片:数据页之间的不连续性,导致查询时需要更多的 I/O 操作。

德仔 986

SQL Server碎片整理

(越小越好) 索引的逻辑碎片,或 分配单元中堆的区碎片。此值按百分比计算,并将考虑多个文件。0 表示 和 分配单元。如果是堆表且模式为 时,为 。如果碎片小于,碎片不太可能会成为问题,如果索引碎片在,碎片可能成为问题,但是可以通过索引重组来消除索引解决,大规模的碎片(当碎片大于),可能要求索引重建。所有页中使用的可用数据存储空间的平均百分比。对于索引,平均百分比应用于 分配单元中 的当前级别。对于堆,表示 分配单元中所有数据页的平均百分比。对于 或 分配单元,表示该分配单元中所有页的平均百

D_A_I_H_A_O的博客 2071

sql server 索引碎片整理

1. 首先需要用sql 查询出数据库索引碎片情况:SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName, ind.name AS IndexName, indexstats.index_type_desc AS IndexType, indexstats.avg_fragmentation_in_percent FROM sys.dm_db_index_ph

霍力强的专栏 6207

SQLServer碎片清理,收缩空间,让碎片占用的存储空间得到释放

长时间使用SQLserver数据库,会发现,时间越长,占用的空间越大,甚至有时候会到达几百G-几T,甚是烦恼,于是乎,我们开发大佬就自己手动写了一个清理数据库碎片,然后利用SSMS工具收缩,直接腾出来百分之70多的空间,经过与大佬沟通,现将代码公布,希望能帮到更多小伙伴。当然,每个库的表结构都会有不同,所以需要拿到代码后,略作修改即可。我这里需要全文替换相对应的表名,列位仁兄拿到以后可能还需要修改对应的表结构。打开ssms软件,找到需要收缩库的表,新建查询→将代码复制进去→修改表名和相关表结构。

weixin_44858074的博客 2524

银河麒麟鲲鹏aarch64架构安装docker和K8s

鲲鹏云服务器上安装docker-云社区-华为云 (huaweicloud.com) 这里我下载的版本是docker-18.09.3.tag docker 安装包地址:https://download.docker.com/linux/static/stable 配置system服务 在github对应分支的contrib/init/systemd/ 下面,提供了对应的docker.service以及docker.socket文件,可以直接拷贝到本地文件使用: 对应链接:https://github.c

qq_50007696的博客 9056

【计算机视觉学习03】全景图像拼接

文章目录一、基本原理1.1 图像拼接的几何原理1.2 直线,圆,复杂曲线方程拟合1.3 RANSAC算法1.4 APAP算法1.5 寻找最佳拼接缝(Seam Finding)1.5.1 最大流问题1.5.2 最大流问题的增广链算法1.5.3 最大流最小割定理二、 图像拼接具体实现2.1 代码2.2 运行结果 一、基本原理 将两幅或多幅具有重叠区域的图像,通过特征匹配将具有相同的特征点(SIFT特征点)的图像拼接在一起,将来自多个不同视角拍摄的图像变换到同一视角下,拼接成一张宽视野图像。 图像拼接基础流程

一个正在努力学习的iter 7789

SQLSERVER 索引碎片整理

SQLSERVER 索引 碎片

編程筆記 1875

人民网留言数据爬取

起因是要做一个LDA主题分析的实践案例,需要数据来源,人民网的留言数据特别的适合,想着能不能用人民网留言数据来做一个LDA,种种原因还是放弃了,但是第一次弯弯绕绕地通过爬虫拿到了数据,还是想记录一下。值得说明的是,这篇博客写于2025年11月9日,其中的加密逻辑可能会随着时间而变动。

Phoenix1st的博客 1027

SQLserver 索引碎片

原文:Microsoft SQL Server 2000 Index Defragmentation Best Practices 来源:Microsoft TechNet 作者:Mike Ruthruff 时间:February 2003Summary As Microsoft SQL Server 2000 maintains indexes to reflect updates to their underlying tables, these indexes can become fragmente

jnrjian的博客 4793

Android13 SurfaceFlinger启动流程分析

在Android13版本中,SurfaceFlinger是由Android.bp去启动init.rc文件,然后再解析文件去加载SurfaceFlinger。上面方法主要处理如下:1、调用surfaceflinger的createSurfaceFlinger方法,实例化surfaceflinger。2、调用flinger(surfaceflinger)的init()方法,在客户端连接之前进行初始化。

liuning1985622的博客 1919

【近源攻击】badusb制作

BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式。HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会自动执行预置在固件中的恶意代码。BadUsb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息、反弹shell、发送邮件等,从而实现控制目标机或者窃取信息的目的。

qinjilll的博客 2550

SQL Server索引碎片处理

一、碎片产生的原因         碎片是由于表中的数据修改产生的。当插入、更新表中的数据时,表对应的聚簇索引被修改,如果对索引的修改不能容纳在同一页面中,可能导致索引叶子页面被分割。从而添加一个新的页面用以包含原来页面的一部分,并且维持索引键中行的逻辑顺序。         虽然新的页面维护了与原页面的中行的逻辑顺序,但是两个页面一般情况下在硬盘上是不相邻的   二、分析查看碎片数量

ceclar123的专栏 8733

BES2300x笔记(36) -- OTA升级

哈喽大家好,这是该系列博文的第三十六篇~ 篇~ <<【系列博文索引】快速通道 >> 一、前言 BES 蓝牙方案自带 OTA(Over The Air)功能,该功能可以对蓝牙固件进行在线升级,目前该功能支持通过安卓手机(苹果手机也有对应APP,未实际测试)对蓝牙固件进行升级,以后还会支持通过 PC 端进行在线升级。在使用 OTA 功能之前,用户需安装 BES 提供的手机 apk 软件,将需要升级的固件拷贝到手机,然后通过该 apk 软件进行在线升级。

文化人的博客 5356

SQL Server查看索引碎片率并进行整理

-第1步:查找碎片大于某个阈值的索引(此处阈值90)--第2步:重新组织索引(把表名复制进来,调整阈值)把红色部分替换为你对应的值。

清山博客 2330

SerDes学习笔记:DFE均衡架构示例(USB3.1、PCIe3.0\4.0)

本文探讨了DFE均衡器架构在不同数据接口中的应用特性。研究表明,抽头数量随数据速率提升而增加,1-16抽头架构较为常见。通过PCIeGen3/4实例分析,对比了单抽头、双抽头和15抽头DFE的性能差异,证明多抽头结构能通过精细调节有效提升噪声容限和降低误码率。文章详细阐述了DFE工作原理,包括其通过反馈信号对输入信号的补偿机制,以及不同抽头对消除码间干扰的作用。实验采用8Gbps速率(125ps/UI)进行波形仿真,直观展示了均衡处理前后的信号变化,为理解信道均衡技术提供了重要参考。

一只豌豆象的博客 519

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

sqlserver查看索引碎片,并整理

【代码】sqlserver查看索引碎片,并整理。

sqlora的专栏 1421

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【SQLServer】表的索引碎片查询和处理

索引的碎片率低于5%或者,索引的页数少于1000,可以忽略;索引碎片率在5%-30%之间的,建议reorganize;索引碎片率大于30%的,建议rebuild。

lied1663634806的博客 2433

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

sqlserver 索引碎片

一、碎片的产生 1.内部碎片(索引页没填满)   SQLServer是以页(8KB)为单位存储数据行和索引数据,因此索引行也不能跨页,也就导致索引页不能被完全填充。   在索引键偏大时,这种情况就比较明显。特别对于聚集索引而言,由于叶级索引页就是数据页,更容易导致内部碎片。例如,一张聚集索引的表,数据行固定为5KB,那么每页只能存放1行记录,相当于叶级索引页只有约60%的利用率。 ...

Hehuyi_In的博客 5827

SQLServer数据库文件碎片整理

  SQLServer数据库在使用时间久之后,往往数据文件及日志文件会变得很大,有时候甚至高达十几G,这个时候一般做法是裁断日志以缩小日志文件、归档历史记录到新数据库或备份文件以便释放空间,然后执行收缩数据库命令来缩小数据文件大小,然而收缩命令经常并不会有太大的作用,因为收缩是以区为单位进行的,并不会对页进行整理。如果数据库上有很多碎片,如一个可容纳8个页的区实际上只存放1个页,就会造成大量磁...

银剑的博客 1827

Sql Server索引碎片

本文主要讲述sqlserver中,索引碎片的优化处理。

qq_44995761的博客 968

SQLServer 索引碎片清理(数据量少执行很慢)

1.查找索引碎片大于50% SELECT OBJECT_NAME(IND.OBJECT_ID) AS TABLENAME ,IND.NAME AS INDEXNAME ,INDEXSTATS.INDEX_TYPE_DESC AS INDEXTYPE ,INDEXSTATS.AVG_FRAGMENTATION_IN_PERCENT FROM SYS.DM_DB_INDEX_PHYSICAL_STATS(DB_ID() ,NULL ,NULL

ningyingjun的专栏 2833

SQL Server高级进阶之索引碎片维护

SQL Server高级进阶之索引碎片维护一、产生原因及影响索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据,它的重要性体现在能够使数据库引擎快速返回查询结果。当对索引所在的基础数据表进行增删改时,若存储的数据进行了不适当的跨页(SQL Server中存储的最小单位是页,页是不可再分...

weixin_33001177的博客 1073

DBA日常维护:SqlServer 索引碎片整理

set nocount on --使用游标重新组织指定库中的索引,消除索引碎片 --R_T层游标取出当前数据库所有表 declare R_T cursor for select name from sys.tables declare @T varchar(50) open r_t fetch next from r_t into @t while @@fetch_status=0 begin --R_index游标判断指定表索引碎片情况并优化 declare R_Index curs

Staid's Space 1503

sql server 索引碎片清理, 以及索引基本概念(“索引页““聚簇因子大小“)

【代码】sql server 清理索引碎片优化版(生成优化索引sql, 可视化)

shuchuxuezhe的博客 790
上一篇: SQL SERVER常用语法汇总
下一篇: sqlserver常用函数大全
thy822
博客等级 码龄19年 313粉丝 294原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值