【问题标题】:Merge vs Select than insert update Performance Compare合并与选择而不是插入更新性能比较
【发布时间】:2014-07-15 10:01:01
【问题描述】:

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

Query1 使用合并语句,Query2 使用标准 Select 而不是插入更新。

我无法决定,因为 Merge 语句使用双方比较, 第 1 面:Table1 > TAble1_Temp 第二面: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
    ;

查询2

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)

table1 中有 2.680.000 行 table1_temp 中有 50.000 行

将 50000 行与 268 万行进行比较。

“选择插入/更新”执行时间似乎比合并好。

有什么想法吗?

客户统计数据:用于合并声明

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

实时数据库上的表名不同。 Adaptv_Report = 表 1, Adaptv_Report_Temp = Table1_temp

合并语句的

执行计划

执行计划选择插入/更新

【问题讨论】:

  • 使用merge时应谨慎:mssqltips.com/sqlservertip/3074/…
  • 注意:Table1 有超过 500 万行。 Table1_Temp 有 10k 行。
  • 你自己的测试告诉你什么?
  • @MikaelEriksson 客户统计已添加。
  • @usr 添加了执行计划。

标签: sql-server performance tsql


【解决方案1】:

解决潜在的性能问题: MERGE 语句在针对大量记录执行时经常表现不佳。有一些方法可以提高 MERGE 和 UPDATE/INSERT 语句的性能。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2011-07-03
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多