如何更优实现:仅当临时表无行存在于永久表时才批量插入?
实现临时表全量插入永久表的优化方案
需求明确:只有当临时表#temp_table里的每一行都不存在于永久表perm_table时,才把临时表所有数据插入永久表;只要有一行已存在,就完全不执行插入操作。
你的现有代码逻辑是对的,但可以从性能和可读性上做优化,下面给出几种更优方案:
方案1:先判断再插入(简洁高效推荐)
先检查临时表和永久表是否有重复行,确认无重复后再执行插入。这种方式逻辑清晰,数据库执行效率更高:
-- 检查是否存在重复的键行 IF NOT EXISTS ( SELECT 1 FROM #temp_table temp JOIN perm_table perm ON perm.key_field_a = temp.key_field_a AND perm.key_field_b = temp.key_field_b ) BEGIN -- 无重复则全量插入 INSERT INTO perm_table (key_field_a, key_field_b, attrib_c, attrib_d, attrib_e) SELECT key_field_a, key_field_b, attrib_c, attrib_d, attrib_e FROM #temp_table END
这个方案的好处:
- 逻辑拆分明显,一眼就能看懂先判断再执行的流程
EXISTS判断会在找到第一行匹配时就终止扫描,比原方案的全连接更高效- 避免在
INSERT语句里嵌套复杂子查询,执行计划更易优化
方案2:用EXCEPT对比键集
通过EXCEPT运算符对比两个表的键值集合,判断临时表的键是否全部不在永久表中:
-- 临时表的键集合减去永久表的键集合,若结果数量等于临时表总条数,说明无重复 IF (SELECT COUNT(*) FROM ( SELECT key_field_a, key_field_b FROM #temp_table EXCEPT SELECT key_field_a, key_field_b FROM perm_table ) AS diff) = (SELECT COUNT(*) FROM #temp_table) BEGIN INSERT INTO perm_table (key_field_a, key_field_b, attrib_c, attrib_d, attrib_e) SELECT key_field_a, key_field_b, attrib_c, attrib_d, attrib_e FROM #temp_table END
这个方案适合需要直观对比键集的场景,但性能略逊于方案1,因为需要计算两次计数,数据量大时扫描成本更高。
原代码的小问题说明
原代码逻辑可行,但如果临时表本身是空的,也会执行插入(插入0行)。如果业务上要求临时表为空时不执行插入,可以在判断条件里加上AND EXISTS(SELECT 1 FROM #temp_table)。
内容的提问来源于stack exchange,提问作者Harjit S. Batra
相关产品推荐
相关产品推荐

