2010-08-03 86 views
0

我正在做一個批量插入,但在插入實際的表之前,我需要做一些檢查。所以目前我正在插入臨時表,但我剛剛看到可以聲明表。所以我的問題是 - 哪個更快?創建或聲明。該表將有多個SELECTS完成,並將包含大約200,000條記錄。SQL效率 - 哪個更快?

DECLARE @tbl1 TABLE 
(
col1 VARCHAR(10) 
) 

CREATE TABLE tbl1 
(
col1 VARCHAR(10) 
) 

最後,是否有可能改變申報表?

謝謝你。

+0

與創建兩個示例腳本的大樣本數據集和使用執行計劃。我建議的唯一的事情是,管理表變量時很容易,因爲它們在超出範圍時清除它們 - 但是永久性登臺表只需要創建一次。 – 2010-08-03 08:28:58

回答

3

@tbl表變量存儲在內存中,但如果內存壓力很高,他們will spill into tempdb

根據設計(沒有索引,統計數據等)在@tbl變量上不允許DDL。

常規表在您連接的數據庫中創建。

性能明智這一切取決於如何配置SQL Server以及將多少資源分配給tempdb。

一般來說,當處理大量記錄時,我會去找一個像#table這樣的連接臨時表,它允許統計表和豐富的表變量索引。

有時它可能是有意義的,有一個永久的登臺表,但你必須特別小心與這種解決方案的併發性。

只有這樣,你可以在這裏一個明確的答案在您的環境測量(注意經常生產不同的配置到dev,心的那個)

+0

我很確定表變量總是執行到tempdb的I/O。那麼,我讀到的大部分源代碼都是這樣的 - 不知道它是否在SQL 2008中進行了更改。 – 2010-08-03 08:29:54

+0

@Adam查看我發佈的鏈接,它來自SQL Server存儲團隊。表變量總是將IO執行到tempdb上,但是如果內存壓力很低,可能會在內存中執行某些操作。他們將永遠不會在您當前的數據庫上執行IO。 – 2010-08-03 08:33:33

+0

夠公平的。這是一個有趣的閱讀。這是我似乎總要谷歌提醒自己什麼是行爲是大聲笑 – 2010-08-03 08:39:34