sqlserver 删除表占用空间随笔

sqlserver服务器的硬盘空间只有几个G了,尝试清理下表占用空间

SELECT   a.name, b.rows
FROM      sysobjects AS a INNER JOIN
                 sysindexes AS b ON a.id = b.id
WHERE   (a.type = 'u') AND (b.indid IN (0, 1))
ORDER BY b.rows DESC


看了下排名前几的表,条数很多(此处犯了一个错误,不应该查条数,而应该查表占用空间)

尝试删除一些历史的记录数,网上查了下,直接根据条件删影响太大,所以循环删除,每次删除1W条,由于这是个按天分区的分区表,所以再加上分区,sql如下:

set rowcount 0;
declare @count int;
set @count = datepart(dayofyear,'2017-08-05');
while 1 = 1
begin
	while 1 = 1
	begin
	delete top(10000) from custom_file_given_Index_log where day = @count;
	if @@ROWCOUNT < 10000
	break;
	end
select @count = @count + 1;
if @count = datepart(dayofyear,'2017-10-01')
break;
end

删除了大概1千多万的数据后,发现硬盘空间没有变化,反而可用空间还少了1G,尝试考虑其他方式

经过网上查找,使用如下语句查看表占用空间:

exec sp_spaceused 'acce_error_log'
exec sp_spaceused 'acce_insert_log'
exec sp_spaceused 'custom_file_given_Index_log'
exec sp_spaceused 'comm_issue_log'

发现是其中两个表占用的数据空间特别大,改为删除这两张表的数据,由于是按天分区的,考虑使用直接删除分区的方法,这样速率比较快,前提条件是先做一个跟要删除表结构一致的临时表,然后switch要删除分区的记录到临时表,再TRUNCATE临时表:

TRUNCATE TABLE [commlog].[dbo].[comm_issue_log_temp]

ALTER TABLE [dbo].[comm_issue_log]
SWITCH PARTITION datepart(dayofyear,'2018-02-27')
TO [dbo].[comm_issue_log_temp]

TRUNCATE TABLE [commlog].[dbo].[acce_error_log_temp]

删除完后发现硬盘空间并没有变化,然后查询数据库占用的空间:

Exec sp_spaceused

发现有Unallocated空间变大,经查资料,这是未分配空间,即数据库已经占用了的硬盘空间,但是并没有分配给任何对象和库,而unused空间指的是数据库已经分配了对象,只是对象的增长速度还没有占满这块空间点击打开链接

后来发现DBA已经做了定时任务,此问题暂时不再处理

阅读更多
个人分类: 项目问题
上一篇tomcat配置监控界面
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭