sqlserver 删除表占用空间随笔

原创 2018年04月16日 17:45:41

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已经做了定时任务,此问题暂时不再处理

SQLServer: 如何查看表占用空间大小

--定义表变量 DECLARE @T TABLE ( [name] VARCHAR(max), [rows] INT, reserved ...
  • yenange
  • yenange
  • 2014-03-13 13:39:30
  • 4257

SQL SERVER 查看表占用空间大小--排除数据库大小异常时特别有用

二、查看表名和表占用空间信息 --判断临时表是否存在,存在则删除重建 if exists(select 1 from tempdb..sysobjects where id=object_id('...
  • anyqu
  • anyqu
  • 2017-10-01 08:51:04
  • 468

SqlServer批量删除表

最近需要删除一批曾经用来存放日志的表,这些表数量很多而且占用了大量的磁盘空间,不得不删除,释放相应的磁盘空间。但是一张一张的手动来删除比较麻烦,在网上找了小技巧,只需要三步,就可以实现批量删除。 第...
  • u012062455
  • u012062455
  • 2018-02-11 17:16:38
  • 76

SQL Server中,删除表,删除表中数据

SQL Server,我们现在基本上使用的最古老的版本应该是SQL Server 2000吧,应该没有更早的版本了吧?!从SQL Server 2000开始,到SQL Server 2005,2008...
  • u012138032
  • u012138032
  • 2016-12-22 12:12:23
  • 6269

简单统计SQLSERVER用户数据表大小(包括记录总数和空间占用情况)

在SQLSERVER,简单的组合sp_spaceused和sp_MSforeachtable这两个存储过程,可以方便的统计出用户数据表的大小,包括记录总数和空间占用情况,非常实用,在SqlServer...
  • feng19821209
  • feng19821209
  • 2008-05-14 22:22:00
  • 1443

SqlServer批量删除表和存储过程

批量处理的代码如下: DECLARE cursorname cursor for select 'drop PROCEDURE  '+name from sysobjects where name ...
  • ysf871104
  • ysf871104
  • 2012-07-31 17:11:20
  • 2267

SQLServer查看数据表占用硬盘的空间大小:sp_spaceused

sp_spaceused [ @objname=], [ @updateusage=] Parameter: [ @objname=] 'objname' -------------------...
  • zhouhaiqing0905
  • zhouhaiqing0905
  • 2015-06-16 15:44:14
  • 2446

SQLServer 删除表中的重复数据

create table Student(        ID varchar(10) not null,        Name varchar(10) not null, ); insert ...
  • DaisyLiu01
  • DaisyLiu01
  • 2017-08-03 19:06:36
  • 504

SQL server 删除表的列

如果这个表的这一列有默认值约束,那么如果直接删除就会报错 这里有两个办法 1.如果创建列的时候给默认约束设置了名字,直接删除该约束 如果是系统默认命名,那么就先获取默认约束名, 删除约...
  • betwater
  • betwater
  • 2016-11-30 11:22:38
  • 3593

sqlserver 查看表所占磁盘空间

方法1: 可以通过SP_SPACEUSED来查看 sp_spaceused 显示行数、保留的磁盘空间以及当前数据库中的表所使用的磁盘空间,或显示由整个数据库保留和使用的磁盘空间。 ...
  • ksrsoft
  • ksrsoft
  • 2012-03-07 08:57:23
  • 1079
收藏助手
不良信息举报
您举报文章:sqlserver 删除表占用空间随笔
举报原因:
原因补充:

(最多只允许输入30个字)