2009-11-30 53 views
2

衆所周知,CTE是在SQL Server 2005中引入的,人羣瘋狂。CTE vs多插入

我有一個情況,我插入一大堆的靜態數據到表中。我想知道的是以下哪一項更快,以及我應該注意哪些其他因素。

INSERT INTO MyTable (MyField) VALUES ('Hello') 
INSERT INTO MyTable (MyField) VALUES ('World') 

WITH MyCTE(Field1) AS (SELECT 'Hello' UNION SELECT 'World') 
INSERT INTO MyTable (MyField) SELECT Field1 FROM MyCTE 

我有一種不舒服的感覺,答案將取決於之類的東西是什麼原因引發的MyTable存在...

(另外,我知道並不在意即CSV和任何數量的其他方法客觀上都是更快和更好的插入靜態數據的方式,我特別想知道我應該知道的關於CTE與多個插入的關注點。)

+2

簡單的解決方案:測試測試測試和測量!在遠離你的系統,磁盤佈局,桌面佈局等情況下,你真的很難說。版本,觸發器等等都會發揮作用。所以真的:只有**你**可以通過測試和測量這兩種方法來判斷..... – 2009-11-30 05:54:12

+0

marc_s,yes測試和分析總是最好的方式來得到你的確切情況的答案,但我是尋找一些更一般的趨勢和考慮因素,以便記住。 – Matthew 2009-12-01 04:51:13

回答

2

不知道您使用的是哪個版本的SQL Server(2005或2008) - 但無論您使用的是哪個版本,坦白地說,在這種情況下使用CTE對於多次插入沒有任何好處。 CTE對於許多情況確實很棒 - 但這不是其中之一。

所以基本上,我建議你只使用幾個INSERT陳述。

在SQL Server 2008中,您可以通過只指定多個值的元組簡化這些:

INSERT INTO MyTable (MyField) 
VALUES ('Hello'), ('World'), ('and outer space') 

與往常一樣,你的表結構,索引和觸發器的存在(或不存在),確實有一個顯著的影響您的INSERT速度。如果您需要加載大量數據,在INSERT期間將這些約束和觸發器關閉有時會更容易,然後重新開始 - 但是又一次:沒有辦法明確指示您的情況是否屬於這種情況具體情況或不是 - 我們不知道的太多變量起着重要作用。衡量它,比較它,爲自己做出決定!

+0

+1:我之前與Quassnoi的聊天表明,使用CTE與內聯視圖沒有提高速度。 – 2009-11-30 06:42:12

+0

@OMGPonies:我會支持這一點 - 但有時候,我發現CTE比複雜的嵌套內聯視圖更易讀,更容易理解。沒有性能好處本身,但更容易閱讀 – 2009-11-30 09:18:20

+0

@OMGPonies,我故意排除像臨時表這樣的東西,但我沒有想到內聯視圖。好點子。你能給你提到的聊天提供一個鏈接嗎? @marc_s,我沒有意識到SQL 2008的新語法。謝謝! – Matthew 2009-12-01 21:48:45