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

长时间使用SQLserver数据库,会发现,时间越长,占用的空间越大,甚至有时候会到达几百G-几T,甚是烦恼,于是乎,我们开发大佬就自己手动写了一个清理数据库碎片,然后利用SSMS工具收缩,直接腾出来百分之70多的空间,经过与大佬沟通,现将代码公布,希望能帮到更多小伙伴。当然,每个库的表结构都会有不同,所以需要拿到代码后,略作修改即可。
具体操作流程:
打开ssms软件,找到需要收缩库的表,新建查询→将代码复制进去→修改表名和相关表结构。左上角选择你想收缩的库名(不选择默认为master),点击执行。
不藏拙,原代码如下:

--轨迹表分批压缩代码
-- 替换表名 Trajectory202403 为需要压缩的表名
IF not EXISTS (
    SELECT *
    FROM sys.indexes 
    WHERE object_id = OBJECT_ID(N'[dbo].[Trajectory202403_bak]')  --AND name = N'[PK_Trajectory202403_bak]'
)
begin

CREATE TABLE [Trajectory202403_bak](
	[Id] [bigint] IDENTITY(1,1) NOT NULL,
	[DeviceId] [int] NOT NULL,
	[Lat] [int] NOT NULL,
	[Lng] [int] NOT NULL,
	[Speed] [tinyint] NOT NULL,
	[Course] [smallint] NOT NULL,
	[Time] [int] NOT NULL,
	[Altitude] [int] NOT NULL,
	[DataType] [tinyint] NOT NULL,
	[AddTime] [int] NOT NULL,
 CONSTRAINT [PK_Trajectory202403_bak] PRIMARY KEY CLUSTERED 
([Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
 
CREATE NONCLUSTERED INDEX [IX_Trajectory202403_bak2_DeviceId] ON [Trajectory202403_bak]
					([DeviceId] ASC
					)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_Trajectory202403_bak2_Time] ON [Trajectory202403_bak]
					([Time] ASC
					)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
end
 print '开始执行1'
	declare @Id int =0;
	declare @MaxId int =0;
	select @MaxId=max(id) from Trajectory202403;
	select @id=max(id) from Trajectory202403_bak;
	if (@id is null)
		set @Id=0
	if (@MaxId is null)
		set @MaxId=0
	select @id,@MaxId;
	 print '开始执行2'
if (@id<@MaxId) 
begin
 	 print '开始执行3'
set IDENTITY_INSERT Trajectory202403_bak  on
  WHILE (@id<@MaxId) 
  begin 
    print '开始执行4'
  	select @id,@MaxId;
  INSERT INTO Trajectory202403_bak(Id,[DeviceId],[Lat],[Lng],[Speed],[Course],[Time],[Altitude],[DataType],[AddTime])
	select top 5000000 Id,[DeviceId],[Lat],[Lng],[Speed],[Course],[Time],[Altitude],[DataType],[AddTime] from Trajectory202403 
	where id>@Id
	order by id asc
	select @id=max(id) from Trajectory202403_bak;
  end
  set IDENTITY_INSERT Trajectory202403_bak  off

drop table Trajectory202403
 
EXEC sp_rename 'Trajectory202403_bak', 'Trajectory202403', 'OBJECT';
 print '执行结束'
 end


我这里需要全文替换相对应的表名,列位仁兄拿到以后可能还需要修改对应的表结构。另外代码中“select top 5000000”,其中500W是可以根据自己表行数来自定义的。可大可小。
下图是我执行成功的输出信息:
在这里插入图片描述
清理完表中碎片,就可以执行给库的收缩啦。

在这里插入图片描述

如有不懂的同仁可留言联系。感谢观看,希望对你们有帮助。同时也感谢我们开发大佬无私提供。

SQL Server空间存储是指数据库系统用来存储数据的物理空间。在SQL Server中,数据存储在数据库文件(.mdf和.ndf)和日志文件(.ldf)中。 数据库文件是主要存储数据的文件,它包含表、索引、视图和存储过程等对象的数据。数据库文件有一个主文件(.mdf)和可选的多个次文件(.ndf),次文件可以用来分布数据并提高性能。 日志文件(.ldf)记录了对数据库的所有修改操作,包括事务的开始、提交或回滚等。日志文件的作用是保证数据库的一致性和持久性,并支持恢复和回滚操作。 为了有效管理数据库空间,SQL Server提供了一些存储管理功能,包括: 1. 数据库文件组:数据库文件可以组织成文件组,方便管理和分配空间。 2. 数据文件增长:当数据库文件的空间不足时,可以设置自动增长选项,使其自动扩展以适应数据增长。 3. 数据压缩:SQL Server提供了数据压缩功能,可以减小数据文件的大小,节约存储空间。 4. 分区表:可以将大型表按照某个列的值进行分区存储,提高查询性能,并便于管理数据。 5. 数据库备份和恢复:SQL Server提供了备份和恢复功能,可以将数据库的数据和日志文件备份到磁盘或磁带,以便在需要时进行恢复。 这些功能可以帮助管理员有效管理SQL Server的空间存储,确保数据库的正常运行和性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值