2011-02-07 113 views
0

我有一张表,我有大约150万个+需要删除的结果。以前,我使用的是临时表,这导致事务日志的大小很快增加。问题是,一旦我完成了一个结果集,我需要移动到另一个有另外150万个结果的地方。这样做的表现相当慢,我想知道是否应该使用table变量而不是将表写入临时数据库。临时表vs表变量

编辑

我使用临时表时,我选择了最初的150万分+的记录。

回答

2

将表变量与临时表问题放在一边,您可能会更好地将您的删除操作分配到while循环中的较小组中。这是保持交易日志大小合理的最佳选择。

是这样的:

while (1=1) begin 
    delete top(1000) 
     from YourTable 
     where ... 

    if @@rowcount < 1000 break 
end /* while */ 
1

一般来说,我更喜欢在临时表上使用表变量,因为它们更容易使用。我发现少数情况下需要使用临时表。你不会谈论你如何在你的例程中使用临时表,但我建议对两个选项进行基准测试。

+0

当我选择1.5mil +记录时使用临时表。然后我使用临时表来删除记录。 – 2011-02-07 16:48:58

+0

@Ardman:你必须有充分的理由从临时表中删除,而不是直接删除行。为什么?你能给我们一个你的逻辑的概述吗? – 2011-02-07 16:50:20

+0

对不起,我不是从临时表中删除。我使用临时表来获取我的记录列表。然后我使用这个列表从表中删除记录。 – 2011-02-07 16:52:09

0

表变量往往不适合于这样的大结果集,是更适合于小的数字。无论如何,你可能会发现表变量的数据会被写入tempdb,因为它的大小。 就我个人而言,当处理大型结果集时,我发现表变量比临时表慢得多。在SQL Server Central的this article末尾提到的一个示例中,每次在表中使用100万行时,使用临时表的查询所花费的时间少于完成时间的六分之一。 就我个人而言,我发现表变量经常在性能方面受到影响,因为我必须将它们连接到查询中的实际表。

如果性能很慢,它可能至少部分是数据库本身的设置。它是否设置为自动增长?它的恢复模式是什么?