哪个查询提高了性能Query1或Query2,
Query1使用merge语句,Query2使用标准选择而不是插入更新。
我无法决定,因为Merge语句使用了两边比较, 第1面:表1> TAble1_Temp 第2面:Table1_Tempt>表1
标准选择比较数据单面Table1_Temp>表1,(是否存在)
感谢advange。
查询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
;
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)
表1中的2.680.000行 table1_temp
中的50.000行将50.000行与2.68 M行进行比较。
“选择插入/更新”执行时间似乎比合并更好。
任何想法?
合并声明的客户端统计信息
客户端统计信息:用于选择而不是插入/更新
合并声明的TableName在实时DB上有所不同。 Adaptv_Report = Table1, Adaptv_Report_Temp = Table1_temp
执行计划
选择插入/更新的执行计划
答案 0 :(得分:3)
解决绩效的基本问题: MERGE语句在针对大量记录执行时经常表现不佳。有很多方法可以改进MERGE和UPDATE / INSERT语句'性能
1)批量执行操作,而不是完整的数据集。这可以通过多种方式完成,其中一种方法是将查询限制为每个批次的特定范围的键值。每个批处理执行都将针对不同的密钥范围执行,直到使用了全部密钥。
2)仅对源数据和目标数据不同的记录进行更新。确定记录是否不同的一种简单方法是在目标和源表上创建计算列,以使计算列包含要更新的列的MD5哈希值。如果源哈希与目标哈希不同,请执行更新。否则不要更新记录。