删除t-sql中所有大表的最佳方法是什么?

时间:2009-04-27 19:10:08

标签: sql sql-server-2005

我们遇到了一个有点奇怪的情况。基本上,我们的一个数据库中有两个表格,这些表格是我们不需要或不关心的大量日志信息。部分原因是我们的磁盘空间不足。

我正在试图清理这些表格,但它会永远消失(在周末运行之后仍有57,000,000条记录......而这只是第一张表格!)

只是使用删除表是永远占用并占用驱动器空间(我相信因为事务日志。)现在我正在使用while循环一次删除记录X,同时玩X来确定什么是实际上最快。例如,X = 1000需要3秒,而X = 100,000需要26秒......其中数学运算稍快一些。

但问题是,是否有更好的方法?

(完成此操作后,要运行SQL代理作业,请每天清理一次表格......但需要先将其清除。)

7 个答案:

答案 0 :(得分:20)

在删除

之前,

TRUNCATE 表或禁用索引

TRUNCATE TABLE [tablename]

截断将删除表中的所有记录,而不单独记录每个删除。

答案 1 :(得分:7)

要添加到其他响应,如果要保留过去一天的数据(或过去一个月或一年或其他),请将其保存,执行TRUNCATE TABLE,然后将其重新插入原始表中:< / p>

SELECT
     *
INTO
     tmp_My_Table
FROM
     My_Table
WHERE
     <Some_Criteria>

TRUNCATE TABLE My_Table

INSERT INTO My_Table SELECT * FROM tmp_My_Table

接下来要做的就是问问自己为什么在没有人关心的情况下将所有这些信息插入到日志中。如果你真的根本不需要它,那么关闭源头的日志记录。

答案 2 :(得分:4)

1)截断表

2)脚本输出表,删除并重新创建表

答案 3 :(得分:2)

TRUNCATE TABLE [tablename]

将删除所有记录而不记录。

答案 4 :(得分:2)

根据您要保留的数量,您只需将所需记录复制到临时表,截断日志表,然后将临时表记录复制回日志表。

答案 5 :(得分:0)

如果你能计算出最佳的x,那么它将以最快的速度不断循环删除。设置rowcount会限制在循环的每个步骤中将被删除的记录数。如果日志文件太大;在循环中粘贴一个计数器并截断每百万行左右。

设置@@ rowcount x 而1 = 1 开始

从表中删除  如果@@ Rowcount = 0 break

结束

将db上的日志记录模式更改为simple或bulk logs将减少一些删除开销。

答案 6 :(得分:0)