Sql server 磁盘空间不足时从表中删除多行
我需要从一个大约有600万行的表中删除大约500万行,因为磁盘空间不足。有没有快速删除它们的方法?我曾尝试在批处理上调用delete,但它需要很长时间才能运行,有时会因为锁而抛出错误,并且什么也不做 编辑: 我在做一个类似于Sql server 磁盘空间不足时从表中删除多行,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我需要从一个大约有600万行的表中删除大约500万行,因为磁盘空间不足。有没有快速删除它们的方法?我曾尝试在批处理上调用delete,但它需要很长时间才能运行,有时会因为锁而抛出错误,并且什么也不做 编辑: 我在做一个类似于 delete from <table> where updated_timestamp < '2012-02-20' 现在,要获得较小的批,查询如下 delete from <table> where id < [100000 row
delete from <table> where updated_timestamp < '2012-02-20'
现在,要获得较小的批,查询如下
delete from <table> where id < [100000 row increments]
SELECT * INTO into #temp FROM <table> WHERE updated_timestamp >= '2012-02-20'
TRUNCATE TABLE <table>
INSERT INTO <table> SELECT * FROM #temp
我得到的错误是,它无法在表上获得锁。我现在没有确切的文本,但是如果我再次遇到它,我会将它粘贴到这里删除行的唯一方法是从何处删除,或者使用TRUNCATE TABLE或DROP TABLE删除所有行,然后重新创建它
恐怕你没有提供比这更具体的答案。通过使用WHERE子句中的条件,可以在较小的行集合中批量执行。有时候抛出一个错误并不能帮助您解决它,顺便说一句,因为如果没有关于错误可能是什么的信息,抛出一个错误是没有意义的。我的建议是,在您的情况下,选择要保存在一个稳定的临时表中的一百万条记录,然后截断该表,因为当您删除记录时,它会将您删除的所有记录记录记录到日志中,这将占用额外的磁盘空间。截断表后,将实体临时表中的记录添加回原始表,并删除实体临时表
您还可以在数据库上运行一个检查点,然后收缩它。它应该会在磁盘上释放一些空间。前面的两个答案绝对正确,你应该为此感谢他们 您正在寻找的是以下内容
delete from <table> where id < [100000 row increments]
SELECT * INTO into #temp FROM <table> WHERE updated_timestamp >= '2012-02-20'
TRUNCATE TABLE <table>
INSERT INTO <table> SELECT * FROM #temp
如果a具有引用表的外键,或者b具有标识列,则这会变得稍微复杂一些。对于前者,您需要删除通过外键约束引用表中记录的所有记录,删除约束,然后截断并重新创建外键。对于后者,可以对insert语句使用以下命令:
SET IDENTITY INSERT <table> ON
INSERT INTO <table> (<field_list>)
SELECT <field_list>) FROM #temp
SET IDENTITY INSERT <table> ON
下面是删除日志表的代码,其中日志已超过一年。使用批处理循环
declare @batch int
declare @i int
declare @j int
set @batch = 1000
set @j = (select (COUNT(*)/@batch) + 1 from LOG_TABLE
where ACCESS_DATE < dateadd(year,-1,getdate()))
set @i = 0
print @j
while (@i < @j)
BEGIN
delete top (@batch)
from LOG_TABLE
where ACCESS_DATE < dateadd(year,-1,getdate())
SET @i = @i + 1
END