我在RPGLE程序中写了下面的SQL。目的是在详细文件 (TC401F( 中不存在相应记录时更新头文件 (TC400F(。有没有更好的方法可以做到这一点?更好的是,我的意思是这将使查询运行得更快或看起来更干净。
Exec SQL UPDATE TC400F
SET T40STS = '05',
T40OFL = '1'
WHERE T40SID = :K#T41SID AND
T40PID = :K#T41PID AND
NOT EXISTS (SELECT * FROM TC401F WHERE
T41SID = :K#T41SID AND
T41PID = :K#T41PID );
试试这个:
Exec SQL UPDATE TC400F f1
SET (f1.T40STS, f1.T40OFL) = ('05', '1')
WHERE f1.T40SID = :K#T41SID AND
f1.T40PID = :K#T41PID AND
NOT EXISTS
(
SELECT * FROM TC401F f2
WHERE (f1.T41SID, f1.T41PID) = (f2.T41SID, f2.T41PID)
);
您在此处没有执行任何明确限制性能的操作。如今,优化器非常聪明。影响 SQL 性能的大多数内容都在语句之外。最好编写语义正确的语句(如上所述(,并让优化器完成它。然后,如果您发现性能问题,请使用Explain
中的工具进行调查Run SQL Scripts
.性能问题很可能源于不正确的索引。
Exec SQL UPDATE TC400F
SET T40STS = '05',
T40OFL = '1'
WHERE (t40sts <> '05' or t40ofl <> '1')
and T40SID = :K#T41SID
AND T40PID = :K#T41PID
and
NOT EXISTS (SELECT onefieldhere FROM TC401F WHERE
T41SID = :K#T41SID AND
T41PID = :K#T41PID );
添加一点乐观的代码,不要更新已经设置的内容。 请不要通过用运算符结束一行而使 as400 成为孤立项,运算符是下一行的开头。 当值已经设置时,乐观更新可能是最快的,因为它知道它已经完成。 您可以通过使用别名字段名称来使其更好,以便将来有人知道 t40ofl 是什么。 仅从 exists 子句中选择一个字段,这样 sql 就不必拉入整行。