我有一张表,我有大约150万个+需要删除的结果。以前,我使用的是临时表,这导致事务日志的大小很快增加。问题是,一旦我完成了一个结果集,我需要移动到另一个有另外150万个结果的地方。这样做的表现相当慢,我想知道是否应该使用table
变量而不是将表写入临时数据库。临时表vs表变量
编辑
我使用临时表时,我选择了最初的150万分+的记录。
我有一张表,我有大约150万个+需要删除的结果。以前,我使用的是临时表,这导致事务日志的大小很快增加。问题是,一旦我完成了一个结果集,我需要移动到另一个有另外150万个结果的地方。这样做的表现相当慢,我想知道是否应该使用table
变量而不是将表写入临时数据库。临时表vs表变量
编辑
我使用临时表时,我选择了最初的150万分+的记录。
将表变量与临时表问题放在一边,您可能会更好地将您的删除操作分配到while循环中的较小组中。这是保持交易日志大小合理的最佳选择。
是这样的:
while (1=1) begin
delete top(1000)
from YourTable
where ...
if @@rowcount < 1000 break
end /* while */
一般来说,我更喜欢在临时表上使用表变量,因为它们更容易使用。我发现少数情况下需要使用临时表。你不会谈论你如何在你的例程中使用临时表,但我建议对两个选项进行基准测试。
表变量往往不适合于这样的大结果集,是更适合于小的数字。无论如何,你可能会发现表变量的数据会被写入tempdb,因为它的大小。 就我个人而言,当处理大型结果集时,我发现表变量比临时表慢得多。在SQL Server Central的this article末尾提到的一个示例中,每次在表中使用100万行时,使用临时表的查询所花费的时间少于完成时间的六分之一。 就我个人而言,我发现表变量经常在性能方面受到影响,因为我必须将它们连接到查询中的实际表。
如果性能很慢,它可能至少部分是数据库本身的设置。它是否设置为自动增长?它的恢复模式是什么?
当我选择1.5mil +记录时使用临时表。然后我使用临时表来删除记录。 – 2011-02-07 16:48:58
@Ardman:你必须有充分的理由从临时表中删除,而不是直接删除行。为什么?你能给我们一个你的逻辑的概述吗? – 2011-02-07 16:50:20
对不起,我不是从临时表中删除。我使用临时表来获取我的记录列表。然后我使用这个列表从表中删除记录。 – 2011-02-07 16:52:09