2009-10-15 17 views

回答

3

在存儲過程中,你經常 需要存儲中的一組數據 的該程序沒有 必然需要該數據到 持續超出 程序的範圍。如果你確實需要一個 表結構,基本上有 四種方式可以在「店」這樣的數據: 局部臨時表(#table_name), 全局臨時表 (## TABLE_NAME),永久表 (TABLE_NAME)和表變量 (@table_name)。

Should I use a #temp table or a @table variable?

本地和全局臨時表 是在tempdb數據庫 內的物理表,索引可以創建 。因爲臨時表是物理 表,你也可以創建一個主 通過CREATE TABLE 命令或通過ALTER TABLE 命令鍵入它們。您可以使用ALTER TABLE 命令在您的代碼中添加任何默認值,新的 列或您需要 的約束。

與本地和全局臨時表 不同,表變量不能在其上創建索引 。唯一的例外是 該表變量可以具有使用DECLARE @variable TABLE 命令創建時 限定的 主鍵。然後,這將在表變量 上創建一個 聚簇索引或非聚簇索引。 CREATE INDEX 命令不識別表 變量。因此,您可以使用的唯一指標 是 伴隨主鍵,是在表變量 聲明創建 索引。也不記錄表變量的事務日誌。因此,他們超出了交易機制的範圍

0

'#myTable是一個臨時表,並受益於能夠有約束和索引等,並使用更多的資源。

@myTable是一個表變量,您可以將其定義爲具有一列或多列。他們用更少的資源和程序屬於你使用它們。

在一個臨時表使用表變量可以代替它可以提供性能優勢大多數情況下的程序。

1

請參閱:

這就是常說的@table變量都保存在內存中,而不是添加到了tempdb; 這不一定正確。

表變量沒有統計信息,這可能會影響某些情況下的性能。

+0

臨時表的行爲與w.r.t相同。內存/硬盤。在可能的情況下,在內存中如果太大則堅持磁盤,在TempDB數據庫中創建DDL。 – GilaMonster 2009-10-15 12:38:41

0

#tabel1是存儲在tempdb中的本地臨時表。 ##table1是存儲在tempdb中的全局臨時表。

@table是表變量。

檢查link他們之間的分歧

1

表變量是一切都很好用相對小的數據集打交道時,但要知道,他們不能很好地擴展。特別是,SQL Server 2000和SQL Server 2005之間行爲的改變導致性能下降,數據集數據量大。

對於我來說,在SQL Server 2000上一個非常複雜的存儲過程中,這對我來說是一個特別討厭的問題。研究和測試表明,使用表變量是更高效的方法。但是,在升級到SQL Server 2008之後,性能下降了很多。花了一段時間才把表變量作爲罪魁禍首,因爲所有的先前的測試等都排除了臨時表更快。但是,由於SQL Server版本之間的這種變化,現在正好相反,經過重大重構後,幾分鐘內完成開始完成的時間已經過去了兩位數小時!

所以請注意,關於哪個最好 - 你需要評估你的情況,進行自己的測試,並根據你的發現做出決定。並且始終在服務器升級後重新評估。

閱讀這篇文章,更詳細的信息和採樣定時 - http://www.sql-server-performance.com/articles/per/temp_tables_vs_variables_p1.aspx

更新:在一個單獨的說明,要知道,還有第三種類型的臨時表 - ## XYZ。這些是全局的,並且對所有SQL Server連接都可見,並且不像常規臨時表那樣限於當前連接。只有在訪問它的最終連接關閉時纔會放棄它們。