合并与选择比插入更新性能比较

hal*_*lit 6 t-sql sql-server performance

哪个查询提高了性能Query1或Query2,

Query1使用merge语句,Query2使用标准选择而不是插入更新.

我无法决定,因为Merge语句使用两侧比较,第1侧:表1> TAble1_Temp第2面:Table1_Tempt> Table1

标准选择比较数据单边Table1_Temp> Table1,(是否存在)

谢谢你的支持.

查询1

MERGE Table1 AS T
USING Table1_Temp AS S
ON (T.col1= S.col1 and T.col2= S.col2) 
WHEN NOT MATCHED BY TARGET
    THEN INSERT(col1, col2,col3,col4,col5,col6,col7,col8,col9,col10,col11) VALUES(S.col1, S.col2,S.col3,S.col4,S.col5,S.col6,S.col7,S.col8,S.col9,S.col10,S.col11)
WHEN MATCHED 
    THEN UPDATE SET T.col3= S.col3,T.col4 = S.col4,T.col5=S.col5,T.col6=S.col6,T.col7=S.col7 ,T.col8= S.col8,T.col9= S.col9,T.col10= S.col10,T.col11= S.col11
    ;
Run Code Online (Sandbox Code Playgroud)

QUERY2

UPDATE
    Table1
SET

    col3 = Table1_Temp.col3,  
    col4 = Table1_Temp.col4,  
    col5 = Table1_Temp.col5,  
    col6 = Table1_Temp.col6,  
    col7 = Table1_Temp.col7,  
    col8 = Table1_Temp.col8,  
    col9 = Table1_Temp.col9,  
    col10 = Table1_Temp.col10,  
    col11 = Table1_Temp.col11,  

FROM
    Table1
INNER JOIN
    Table1_Temp
ON
    Table1.col1 = Table1_Temp.col1 and 
    Table1.col2= Table1_Temp.col2




Insert Into Table1(col1, col2,col3,col4,col5,col6,col7,col8,col9,col10,col11)
Select  col1, col2,col3,col4,col5,col6,col7,col8,col9,col10,col11
        from Table1_Temp S  Where  not exists 
        (Select * from Table1 where S.col1 = Table1.col1 and S.col2 = Table1.col2)
Run Code Online (Sandbox Code Playgroud)

表1中的2.680.000行table1_temp中的50.000行

比较50.000行和2.68 M行.

"选择插入/更新"执行时间似乎比Merge更好.

任何的想法 ?

客户端统计信息:用于合并声明

合并声明

客户端统计:用于选择而不是插入/更新

选择然后更新 - 插入

TableName在实时DB上有所不同.Adaptv_Report = Table1,Adaptv_Report_Temp = Table1_temp

合并声明的 执行计划制定执行计划

选择插入/更新的 执行计划在此输入图像描述

小智 3

解决根本的性能问题:当对大量记录执行时,MERGE 语句经常表现不佳。有多种方法可以提高 MERGE 和 UPDATE/INSERT 语句的性能。

1)批量执行操作,而不是针对整组数据。这可以通过多种方式完成,其中之一是将查询限制为每个批次的特定范围的键值。每个批处理执行都会针对不同范围的密钥执行,直到使用完整范围的密钥。

2) 仅对源数据和目标数据不同的记录进行更新。确定记录是否不同的一种简单方法是在目标表和源表上创建一个计算列,以便该计算列包含要更新的列的 MD5 哈希值。如果源哈希与目标哈希不同,则进行更新。否则不更新记录。