我有一个包含3.72亿行的表,我想从第一行开始删除旧行而不阻塞数据库。我该怎么做到?
表格
id | memberid | type | timeStamp | message |
1 123 10 2014-03-26 13:17:02.000 text
更新:
我在DB中删除了大约30 GB的空间,但我的DISC仍然是6 GB的空间.. 有什么建议可以获得这个空闲空间吗?
提前谢谢!
答案 0 :(得分:9)
select 1;
while(@@ROWCOUNT > 0)
begin
WAITFOR DELAY '00:00:10';
delete top(10) from tab where <your-condition>;
end
使用上面的sql
删除块答案 1 :(得分:4)
您可能需要考虑另一种方法:
sp_rename
在开始删除记录/播放表格之前备份数据库。
答案 2 :(得分:0)
最佳性能是按ID查询数据,然后:
delete from TABLENAME where id>XXXXX
是您可以执行的最低影响。
您还可以在子操作中划分操作,限制每个操作的已删除行数,并添加ROWCONT declatarion,
例如,如果您希望每次调用只删除5.000.000行,则可以执行此操作:
SET ROWCOUNT=5000000;
delete from TABLENAME where id>XXXXX;
在这里,您可以找到参考https://msdn.microsoft.com/it-it/library/ms188774%28v=sql.120%29.aspx?f=255&MSPPError=-2147217396
答案 3 :(得分:0)
从Oracle表中删除行的最佳方法的答案是:它 要看!在一个完美的世界里,你可以让桌子离线 维护,完全重组总是最好的,因为它确实如此 删除并将表放回原始状态。我们会 解决了进行大规模删除的工具和相应的工具 每种环境的方法。
大规模删除的因素和工具
删除方法的选择取决于许多因素:
目标表是否已分区?分区极大地提高了删除性能。例如,通常有一个大的基于时间的表分区,并且从这些表中删除旧行可以像删除所需的分区一样简单。请参阅有关管理分区表的这些说明。
您可以在删除后重新组织表以删除碎片吗?
该表的百分比将被删除?如果您要删除超大型表中超过30-50%的行,则使用CTAS从表中删除比执行vanilla删除和重组表块以及重构约束更快和索引。
您是否要释放已删除行所占用的空间?如果您知道后续DML将重新使用空白区域,那么您将希望在表格中留下空白区域。相反,如果要将空间释放回表空间,则需要重新组织表。
您可以使用许多工具从大型表中删除:
dbms_metadata.get_ddl:此过程将打破所有表索引和约束的定义。
dbms_redefinition:此过程将重新组织表,同时它仍可用于更新。
将表创建为选择:您可以使用CTAS复制表,同时批量删除行。
重命名表:如果在删除行时复制表,则可以将其重命名为原始名称。
COMMIT:如果删除可能会运行很长时间,即使是最大的UNDO日志也无法保存回滚信息,因此有必要在PL / SQL循环中执行删除操作, COMMIT每个zillion-rows释放撤消日志。这种方法可以自动重新启动,因为删除将在最后一次提交检查点时从中断处继续。
更多信息请访问here