2009-04-27 81 views
14

我们碰到了一个稍微奇怪的情况。基本上,在我们的数据库中有两个表格,它们是喂食吨和吨我们不需要或关心的日志信息。部分原因是因为我们的磁盘空间不足。删除t-sql中所有大表的最佳方法是什么?

我试图清理出表,但它采取永远(还有57,000,000+记录到周末让这个运行后......而这仅仅是第一台!)

只需使用delete桌子正在永久占用硬盘空间(我相信是因为事务日志)。现在我使用while循环来一次删除记录X,同时玩X来确定实际上最快的事情。例如,X = 1000需要3秒,而X = 100,000则需要26秒......数学计算稍快。

但问题是有没有更好的方法?在删除之前

(一旦做到这一点,要运行一个SQL代理作业去擦桌子了一天一次......但需要它清除了第一。)

+0

信息,您在表中删除所有记录? – 2009-04-27 19:14:18

+0

这不是GFI吗? – 2009-04-27 19:25:01

+0

我不知道GFI是什么......所以可能不是。 – CodeRedick 2009-04-27 21:56:07

回答

20

TRUNCATE表或禁用索引

TRUNCATE TABLE [tablename] 

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

+1

值得链接到http://en.wikipedia.org/wiki/Truncate_(SQL)作为跳转,以确保他们理解的限制,但完全同意的建议 – ShuggyCoUk 2009-04-27 19:13:53

2
TRUNCATE TABLE [tablename] 

将会删除所有没有记录的记录。

4

1)截断表

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

2

取决于你多么想留着,你可以只所需的记录复制到一个临时表,截断日志表,并将临时表记录复制回日志表。

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 

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

0

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

组@@行数X 而1 = 1 开始

从表 删除如果@@行数= 0破

结束

变化DB中的记录模式,以简单或批量记录将减少一些删除开销。

相关问题