长时间使用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是可以根据自己表行数来自定义的。可大可小。
下图是我执行成功的输出信息:

清理完表中碎片,就可以执行给库的收缩啦。

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

2418

被折叠的 条评论
为什么被折叠?



