0

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

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

我可以写一个嵌套的 SQL

update CUSTOMER set NAME = (select NEW_NAME from MAPPING where OLD_NAME = NAME) 
where NAME in (select OLD_NAME from MAPPING)

带循环和条件的查询过程

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;

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

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

就个人而言,我认为过程一更好,因为嵌套 SQL 必须扫描 MAPPING 表两次(where & set 子句),但我不确定。

4

1 回答 1

5

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

有几个原因。首先是事务开销。每次更新都有事务开销,因此您可以通过一次更新而不是多次更新来大大减少这种开销。

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

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

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

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

于 2013-11-05T14:42:39.703 回答