通过避免数据库写操作来提高4GL性能

时间:2013-07-25 19:28:01

标签: progress-4gl

在我公司,我们最近一直在修改现有程序,该程序使用以下逻辑执行某些数据库字段分配:

db-buffer1.field1 = if db-buffer1.field1 <> db-buffer2.field2
                        then db-buffer2.field2
                        else db-buffer1.field1

我不是100%肯定原始程序员的意图。在决定是否分配新字段之前,任何人都可以帮助我理解比较字段值是否不同的价值吗?

如果比较为'false'并且我们最终分配db-buffer1.field1 = db-buffer1.field1,我们是否避免对数据库进行写操作?

另请注意,此示例是较大ASSIGN语句的一部分,该语句包含几个运行类似赋值/比较逻辑的字段。这会对此附加代码的值产生任何影响吗? (即,ASSIGN语句中的所有比较是否必须成功才能避免DB写入?)

3 个答案:

答案 0 :(得分:0)

表达式右侧的“IF函数”很像C或Javascript中的“三元运算符”(“?:”结构)。

它只会影响它所属的ASSIGN部分。当我使用那些代码编写代码时,我总是将它包含在parens中以表明它。像这样:

assign
  a = ( if x = y then b else c )
  z = 2
.

WRITE是否发生在很大程度上取决于代码的其余部分。

仅通过此片段判断您将编写SOMETHING(至少在逻辑上)。无论如何,db-buffer.field1都将获得一个赋值给它的值。如果它是field1或field2,右侧的IF逻辑就是选择。在归结为field1 = field1的情况下,您可能希望某些较低层将优化写出存在。我没有看到您发布的Progress版本,但如果它是v9或更好,那么它可能会被优化掉。 (在v9之前它不会。)

如果你真的想在应用程序级别“避免写”,你应该像这样编码:

if field1 <> field2 then
  assign
    field1 = field2
  .

这个表格不使用IF函数,它只是一个正常的IF ... THEN语句。它更清晰,并且不依赖于较低级别的优化。当然,所示的片段被认为是更大的ASSIGN的一部分 - 因此,如我所示,将其分解并写出它可能是也可能不是明智的。但值得思考。

答案 1 :(得分:0)

程序员似乎正在检查field1是否不等于field2继续并更新它。

他们也可以简单地使用以下内容,因为正在分配字段的任何一种方式:

   assign db-buffer1.field1 = db-buffer2.field2.

使用ASSIGN语句(始终建议)时,从逻辑角度来看,您必须记住每一行都是单独分配的。

Tom has a great answer here提供有关ASSIGN声明效率/历史的更多信息。

答案 2 :(得分:0)

我很想看到assign语句的其余部分,但在这种情况下我也会摆脱if逻辑,因为它不会增加任何值,只是和额外的指令。正如特里上面所述

 ASSIGN db-buffer1.field1 = db-buffer2.field2.