2011-07-06 61 views

回答

1

你不能比較臨時和永久表:

  • 持久表讓您的數據,可以由任何過程中使用。
  • 臨時的有扔掉並#ones只對連接

你會使用一個臨時表來後臺進行進一步的處理和這樣的結果是可見的。

這兩種類型的表之間的性能(無論哪種方式)幾乎沒有差異。

您不應該隨時丟棄和創建表......任何依賴於此的應用程序都會出錯,尤其是太多的SQL調用。

+0

我知道,我同意刪除和創建持久表是錯誤的。我想知道是什麼讓#tables變得不同。這是他們的範圍主要區別... –

+0

作用域和它們在tempdb中。你的問題特別要求關於併發性和性能,這兩者都不是真的 – gbn

+0

嗯,但是如果你使用全局臨時表作用域並不是一個區別...... –

0

(1)臨時表是在SQL Server TEMPDB數據庫中創建的,因此需要更多的IO資源和鎖定。表格變量和派生表格在內存中創建。 (2)對於可以使用並行處理的大量數據,臨時表通常執行得更好,而表變量最適用於少量數據(我使用的規則爲100行或更少的行),其中並行性不會提供顯着的性能改進。 (3)您不能使用存儲過程將數據插入到表變量或派生表中。例如,以下內容將起作用:INSERT INTO #MyTempTable EXEC dbo.GetPolicies_sp,而以下內容將生成錯誤:INSERT INTO @MyTableVariable EXEC dbo.GetPolicies_sp。

(4)派生表只能從SELECT語句創建,但可以在Insert,Update或Delete語句中使用。 (5)按照作用域持久性的順序,Temp表擴展了最遠的範圍,接着是表變量,最後是派生表。

+0

這只是從網上剪切和粘貼,我不相信1)是正確的。 – Yellowfog

+0

對不起,這是從我的博客和這百分之百正確的一個剪切和粘貼。你能否給我任何與這個主題無關的理由。 –

0

1) 表變量的生命週期僅適用於其運行事務的持續時間。如果我們先執行DECLARE語句,然後嘗試將記錄插入到@temp表變量中,我們會收到錯誤,因爲表變量已經不存在了。如果我們在一個事務中聲明並在@temp中插入記錄,然後嘗試查詢該表,結果是相同的。如果您注意到,我們需要針對#temp執行DROP TABLE語句。這是因爲表持續存在,直到會話結束或表被刪除。

2) 表變量有一定的明確限制。

- 表變量不能有非聚集索引 - 你不能在表變量創建約束 - 你不能在表變量列 -statistics不能對錶變量 -Similarities與創建創建默認值臨時表包括:

相似之處臨時表包括:

-Instantiated在tempdb -Clustered索引可以在 導向軸都記錄在事務表變量和臨時表創建日誌 - 就像使用臨時表和常規表一樣,用戶可以對錶變量執行所有數據修改語言(DML)查詢:SELECT,INSERT,UPDATE和DELETE。

相關問題