Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 磁盘空间不足时从表中删除多行_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 磁盘空间不足时从表中删除多行

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

我需要从一个大约有600万行的表中删除大约500万行,因为磁盘空间不足。有没有快速删除它们的方法?我曾尝试在批处理上调用delete,但它需要很长时间才能运行,有时会因为锁而抛出错误,并且什么也不做

编辑:

我在做一个类似于

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