Sql DB2替代现有函数

Sql DB2替代现有函数,sql,db2,query-optimization,udb,Sql,Db2,Query Optimization,Udb,我在DB2上运行的应用程序中有以下查询: SELECT COD.POST_CD,CLS.CLASS,COD2.STATUS_CD FROM DC01.POSTAL_CODES COD INNER JOIN DC02.STATUS_CODES COD2 ON COD.ORDER=COD2.ORDER INNER JOIN DC02.VALID_ORDERS ORD ON ORD.ORDER=COD.ORDER WHERE ( ( EXISTS (SELECT 1 FROM DC00.PR

我在DB2上运行的应用程序中有以下查询:

SELECT COD.POST_CD,CLS.CLASS,COD2.STATUS_CD
FROM DC01.POSTAL_CODES COD
INNER JOIN DC02.STATUS_CODES COD2
ON COD.ORDER=COD2.ORDER
INNER JOIN DC02.VALID_ORDERS ORD
ON ORD.ORDER=COD.ORDER
WHERE
( 
    ( EXISTS (SELECT 1 FROM DC00.PROCESS_ORDER PRD
          WHERE PRD.ORDER=COD.ORDER
              AND PRD.IDNUM=COD.IDNUM
        )
    ) OR
    ( EXISTS (SELECT 1 FROM DC00.PENDING_ORDER PND
          WHERE PND.ORDER=COD.ORDER
              AND PND.IDNUM=COD.IDNUM
        )
    )
)
AND EXISTS (SELECT 1 FROM DC00.CUSTOM_ORDER CRD 
           WHERE CRD.ORDER=COD.ORDER
                  )
;
当我们更改为UDB(LUW v9.5)时,我们收到以下警告:

IWAQ0003W SQL warnings were found
SQLState=01602 Performance of this complex query might be sub-optimal.  
Reason code: "3".. SQLCODE=437, SQLSTATE=01602, DRIVER=4.13.111

我知道此警告是由于EXISTS()或EXISTS语句引起的。但我不确定是否有其他方法可以编写此查询来替换。如果是和,我可以做一个内部连接,但是我不能改变这个条件。有谁能提出更好的方法来替换这些已存在的语句吗?

现在,这是一条很酷的警告消息;)-如果您使用
UNION
将未决订单和处理订单的两个子查询合并为一个查询,那么您只会有一个EXISTS(尽管结果更大),呃,
CLS.CLASS
引用了哪个表?另外,不能使用联接的原因是,您正在寻找唯一的结果,而不是do to和/或条件(实际上,这也不是真的,因为您可以使用作为查询的表引用)。我想至少您可以将or条件与
UNION ALL
组合,尽管我更喜欢使用联接…这可能只是意味着您没有任何查询表和/或索引的当前统计信息。因为您切换了DB版本。可能有一个bug正在影响您。您可能希望使用
UNION ALL
代替
UNION
,以避免不必要的排序。
SELECT COD.POST_CD,CLS.CLASS,COD2.STATUS_CD
FROM DC01.POSTAL_CODES COD
INNER JOIN DC02.STATUS_CODES COD2
ON COD.ORDER=COD2.ORDER
INNER JOIN DC02.VALID_ORDERS ORD
ON ORD.ORDER=COD.ORDER
WHERE
( 
     EXISTS SELECT 1 FROM 
              (SELECT ORDER,IDNUM FROM DC00.PROCESS_ORDER PRD UNION 
               SELECT ORDER,IDNUM FROM DC00.PENDING_ORDER PND) PD
          WHERE PD.ORDER=COD.ORDER
              AND PD.IDNUM=COD.IDNUM
)
AND EXISTS (SELECT 1 FROM DC00.CUSTOM_ORDER CRD 
           WHERE CRD.ORDER=COD.ORDER
              )
;