在 DB2 中编写 SQL 语句的更好方法,该语句使用 "EXISTS" 关键字



我在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 就不必拉入整行。

最新更新