Sql-Server

合併比插入快

  • May 8, 2015

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

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/100941