具有多个查询和循环的SQL过程的性能是否优于嵌套SQL

Aob*_*ang 0 sql db2 stored-procedures

我面临的任务是我可以在多个语句的整个嵌套SQL和SQL过程中实现.我想知道我应该根据性能选择哪一个,以及如何评估和比较它们.

这是我的情况.我的一些客户更改了他们的名字,我的任务是通过包含OLD_NAMENEW_NAMEMAPPING表更新我的CUSTOMER表的NAME列.

我可以编写一个嵌套的SQL

update CUSTOMER set NAME = (select NEW_NAME from MAPPING where OLD_NAME = NAME) 
where NAME in (select OLD_NAME from MAPPING)
Run Code Online (Sandbox Code Playgroud)

带循环和条件的查询过程

for record as
  select NAME from CUSTOMER
do
  select NEW_NAME into newName from MAPPING where OLD_NAME = record.NAME;
  if newName is not NULL then
    update CUSTOMER set NAME = newName where NAME = record.NAME;
  end if;
end do;
Run Code Online (Sandbox Code Playgroud)

当然,对于第二个,我最好使用prepare和execute缓存update语句.

我的问题是哪一个更好.或者两者都很愚蠢,那么你能给我一个更好的吗?我可以知道如何分析他们的表现吗?

就个人而言,我认为程序更好,因为嵌套的SQL必须扫描MAPPING表两次(其中&set子句),但我不确定.

Gor*_*off 5

作为一般规则,对一组数据执行一次更新将比执行多个单独更新具有更好的性能.

有几个原因.第一个是交易开销.每个更新都有事务开销,因此您可以通过执行一次更新而不是多次更新来大大减少此操作.

如果您在表上定义了索引,那么这种事务开销会更加明显.执行多个单独的索引插入通常比执行一个较大的索引插入要慢得多.

其次,DB2可以利用查询中的并行性.但是,循环强制执行顺序操作.

第三,在循环中完成工作可能需要将数据从"数据库上下文"移动到"循环执行上下文" - 即两个进程之间.这种数据移动将是不必要的开销.例如,您可能正在使用客户端接口运行代码,在这种情况下,每行都需要返回给客户端.

而且,另一个与性能无关的原因.通过在一个查询中完成工作,如果出现问题(例如,机器重新启动),则会有一个事务.要么所有更新都发生,要么都不发生.事务语义对于一系列更新是不同的(尽管您可以将更新包装在另一个事务中).