Sql-Server
合併比插入快
merge
使用 a overinsert
函式有什麼優點/缺點嗎?語句可以insert
使用“輸出”嗎注意: 的
ON
子句merge
設置為1=0
(始終插入)Merge DeviceReading Using ( --table here ) As [Source] On (1 = 0) -- Effectively Makes this an Insert as 1 Never Matches 0 When Not Matched Then INSERT ( [value1], [value2] ) VALUES ( @value1, @value2 ) OUTPUT Inserted.[value1], Inserted.[value2] Into @InsertIDTable;
MERGE
有更靈活OUTPUT
的。OUTPUT
如果您希望客戶端能夠將其發送的內容與實際插入的內容(例如IDENTITY
值)相匹配,可以參考合併源,這很方便。INSERT
不能這樣做(沒有根本原因;似乎沒有實施)。我想不出任何性能差異。這些計劃當然看起來如此相似,以至於我現在無法區分。如果存在重大差異,SQL Server 可以將一種形式優化到另一種形式。
考慮到這一點,我決定回答而不是評論以提供更詳細的資訊。
是的,INSERT 語句可以使用 OUTPUT 子句。它可以在 VALUES 子句之前指定。有關權威的 T-SQL 參考,請參閱 SQL Server 聯機叢書 ( http://technet.microsoft.com/en-us/library/ms174335.aspx )
我建議您避免
MERGE
在生產程式碼中進行無條件插入。它不提供額外的功能,需要更少的程式碼,並且更易於維護。比較 aMERGE
與的執行計劃INSERT
,`MERGE 計劃包括額外的標量運算符用於額外的常量。我不希望有顯著的執行時間差異,但編譯時間可能會稍高一些。以下是這兩種技術的功能相同的範例。
DECLARE @value1 varchar(10) , @value2 int; DECLARE @test table ( col1 char(8000), col2 int ); MERGE test USING ( SELECT 1 x ) AS [Source] ON ( 1 = 0 ) -- Effectively Makes this an Insert as 1 Never Matches 0 WHEN NOT MATCHED THEN INSERT ( [col1], [col2] ) VALUES ( @value1, @value2 ) OUTPUT Inserted.[col1] , Inserted.[col2] INTO @test; GO DECLARE @value1 varchar(10) , @value2 int; DECLARE @test table ( col1 char(8000), col2 int ); INSERT INTO dbo.test ( [col1], [col2] ) OUTPUT Inserted.[col1], Inserted.[col2] INTO @test VALUES ( @value1, @value2 ); GO