更新中的 RPGLE 性能中嵌入 SQL

Embedded SQL in RPGLE performance in Update

在 RPGLE 程序中使用嵌入式 SQL 更新文件中的 date/time 字段时,我可以使用 CURRENT_DATE/CURRENT_TIME 或存储当前 date/time 值到主变量中。并使用此主机进行分配。

现在我想知道哪种方式更快?或者这无关紧要?

exec sql
  update testpf
  set t1date = CURRENT_DATE, t1time = CURRENT_TIME
  where t1key = someValue;

dcl-s date date;
dcl-s time time;
exec sql
  set :date = CURRENT_DATE;
exec sql
  set :time = CURRENT_TIME;
exec sql
  update testpf
  set t1date = :date, t1time = :time
  where t1key = someValue;

注:这都是写的"on the fly"!但我希望你明白我的意思

编辑:澄清一下,目标不是只更新一行,而是多次更新。就像拥有一个包含发票位置和状态字段的数据库。该状态字段有 3 个相邻字段,用于跟踪用户在哪一天、什么时间更改它。在我的例子中,可能有几个位置需要更新时间和日期。

如果您要使用 CURRENT_DATECURRENT_TIME 寄存器,我希望最好只在需要它们的 SQL 语句中使用它们。您的第二个示例涉及对数据库的三个请求,而第一个示例仅涉及一个。所以我怀疑第一个会更好,因为所有三个都有相同的(获取此寄存器)开销,但第二个调用开销是一次的三倍。

此外,第一个更易于阅读(最重要的考虑因素,IMO,除非不是)。也就是说,如果你真的不需要优化,就不需要优化。当然,如果我想在 RPG 中检索当前日期和时间,我不会使用 SQL 来实现,而是使用 %date()%time() 等内置的 RPG ;-)

编辑: 这里有一些非性能方面的考虑。如果您想要在所有行上使用相同的 date/time,在所有更新中,您将必须提前捕获日期和时间。如果您想要更新的实际日期和时间,您将需要使用寄存器。 SQL 做的一件好事是,如果您在单个 SQL 语句中多次使用 CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP 或这些的一些混合, 对于给定的语句执行,更新的所有行都将具有相同的日期、时间和时间戳。

我的两分钱。您知道 IBM i 上的行更改时间戳列吗?它们在 https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/sqlp/rbafysqlprcts.htm?

中有描述

他们可以通过在每次插入或更新行时自动维护时间戳列来为您节省大量编码。另一方面,它仅支持时间戳列,不支持分隔的日期和时间列。

我认为你的问题没有简单的答案,事实上,如果你搜索有关主机变量的信息,IBM 也不会给你一个快速的答案,看这里:

宿主变量需要默认过滤因子。当您绑定包含主机变量的静态 SQL 语句时,Db2 使用默认过滤因子来确定 SQL 语句的最佳访问路径。 Db2 通常会为具有多个主机变量的查询选择执行良好的访问路径。但是,在新版本中或应用维护后,Db2 可能会选择性能不如旧访问路径的新访问路径。在很多情况下,访问路径的变化是由于默认的过滤因素,这可能会导致 Db2 以不同的方式优化查询。

我个人会使用第一个选项。代码更简单,我无法想象会有显着的性能差异。

我唯一会选择第二个选项的情况是日期有时可能需要是系统日期以外的其他日期(例如 UDATE)。