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

Cod*_*ick 14 sql sql-server-2005

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

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

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

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

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

Joe*_*ips 20

在删除之前 TRUNCATE表或禁用索引

TRUNCATE TABLE [tablename]
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*m H 7

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

SELECT
     *
INTO
     tmp_My_Table
FROM
     My_Table
WHERE
     <Some_Criteria>

TRUNCATE TABLE My_Table

INSERT INTO My_Table SELECT * FROM tmp_My_Table
Run Code Online (Sandbox Code Playgroud)

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