【问题标题】:Is the performance of SQL procedure with multiple queries & loop better than nested SQL具有多个查询和循环的 SQL 过程的性能是否优于嵌套 SQL
【发布时间】:2013-11-05 14:26:41
【问题描述】:

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

这是我的情况。我的一些客户更改了他们的名字,我的任务是通过包含 MAPPING 表来更新我的 CUSTOMER 表的 NAME 列OLD_NAMENEW_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 子句),但我不确定。

【问题讨论】:

    标签: sql stored-procedures db2


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 谢谢,所以如果只考虑性能,我应该总是使用嵌套 SQL。但是,出于最后一个原因,我认为“全有或全无”并不是优势。这可能取决于要求。例如,在更新/插入序列中,我可以使用计数器提交大量数据的每数千次更改。因此,如果发生任何意外,我可以从停止的地方继续,保持之前的努力。
    • “将更新包装在另一个事务中”...您的意思是我可以编写一个包含所有更新的过程,并且只在整个过程完成时提交该过程?
    • 对于活动生产数据库中的大量更新,需要进行一系列小更新(检查点重启)(而不是一个大事务)。
    • 我不一定会说“始终使用嵌套 SQL”,因为有时可能会有更好的技术允许在单个语句中执行某些操作。我倾向于更频繁地使用公用表表达式和连接。但作为一个粗略的经验法则,需要的语句越少越好。
    • @WarrenT 我明白了,谢谢。您能否给我一个示例,我们最好使用单个语句而不是将它们嵌套到一个语句中?
    猜你喜欢
    • 2019-08-02
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2018-11-19
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多