我有一张桌子,我需要删除大约150万个+结果。以前,我使用临时表,这导致事务日志的大小很快增加。问题是,一旦我完成了一个结果集,我需要转移到另一个结果集中另外150万个结果集。这个性能相当慢,我想知道是否应该使用table
变量而不是将表写入临时数据库。
修改
当我选择最初的150万条记录时,我会使用临时表。
答案 0 :(得分:2)
将表变量与临时表问题放在一起,你可能最好将删除批量转换为while循环内的较小组。这是保持交易日志大小合理的最佳选择。
类似的东西:
while (1=1) begin
delete top(1000)
from YourTable
where ...
if @@rowcount < 1000 break
end /* while */
答案 1 :(得分:1)
一般来说,我更喜欢在临时表上使用表变量,只是因为它们更容易使用。我发现很少有使用临时表的情况。你没有谈论如何在例程中使用临时表,但我建议对这两个选项进行基准测试。
答案 2 :(得分:0)
表变量通常不适用于如此大的结果集,更适合于小数字。您可能会发现表变量的数据由于其大小而无论如何都会被写入tempdb。 我个人发现在处理大型结果集时,表变量要比临时表慢得多。在SQL Server Central this article末尾提到的每个表中使用100万行的示例中,使用临时表的查询只需不到六分之一的时间即可完成。 就个人而言,当我必须将它们连接到查询中的真实表时,我发现表变量通常会受到性能影响。
如果性能较慢,则可能至少部分是数据库本身的设置。它会自动增长吗?什么是它的恢复模型?