2011-02-07 78 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萬行時,使用臨時表的查詢所花費的時間少於完成時間的六分之一。 就我個人而言,我發現表變量經常在性能方面受到影響,因爲我必須將它們連接到查詢中的實際表。

如果性能很慢,它可能至少部分是數據庫本身的設置。它是否設置爲自動增長?它的恢復模式是什麼?