SQL Db2 中的左连接而不是不存在

Left Join instead of Not Exists in SQL Db2

由于性能不佳,我目前正在修改我的 SQL 查询。

因此查询会检查 table A 和 B,并报告 table B 是否缺少某些内容。 目前我正在使用“不存在的地方”的解决方案,这导致必须完全选择两个 table。这导致性能不佳

SELECT A.DBNAME,                                     
       A.TSNAME,                                     
       VARCHAR(A.PARTITION)                          
FROM DUMMY.TABLEONE A WHERE NOT EXISTS          
   (SELECT B.DBNAME                                  
          ,B.TSNAME                                  
          ,B.LOGICAL_PART                            
          ,B.ICDATE                                  
          ,B.ICTYPE                                  
           FROM DUMMY.TABLETWO B                     
   WHERE B.DBNAME = A.DBNAME AND B.TSNAME = A.TSNAME 
   AND   A.PARTITION = B.LOGICAL_PART                
   AND   B.ICTYPE = 'F'                              
   AND   B.ICDATE > CURRENT DATE - 7 DAYS);      

这个查询给了我正确的结果集,但是性能很差。

我试着重新写成左加入:

SELECT A.DBNAME,                                       
       A.TSNAME,                                       
       VARCHAR(A.PARTITION)                            
FROM DUMMY.TABLEONE A                             
LEFT JOIN                                              
DUMMY.TABLETWO B                                       
ON A.DBNAME = B.DBNAME AND                             
   A.TSNAME = B.TSNAME AND                             
   A.PARTITION = B.LOGICAL_PART                        
   WHERE B.DBNAME IS NULL                              
   OR  (A.DBNAME = B.DBNAME AND                        
        A.TSNAME = B.TSNAME AND                        
        A.PARTITION = B.LOGICAL_PART AND               
        B.ICDATE > CURRENT DATE - 7 DAYS);                 

但是由于 table B 上的条目没有被删除,我得到的结果太多了。 我只想检索 table A 上的条目,而在 table B 上最近 7 天内没有相应的条目。 必须保留旧条目,否则我将实施内务管理解决方案。

提前感谢您的帮助

您可以考虑将 TABLETWO table 索引如下:

CREATE INDEX tt_idx ON DUMMY.TABLETWO (DBNAME, TSNAME, LOGICAL_PART, ICTYPE, ICDATE);

对于 TABLEONE table 中的每条记录,这应该可以让现有逻辑执行得更快。此外,您可以简化现有语法,如下所示:

SELECT A.DBNAME, A.TSNAME, VARCHAR(A.PARTITION)
FROM DUMMY.TABLEONE A
WHERE NOT EXISTS (
    SELECT 1
    FROM DUMMY.TABLETWO B
    WHERE B.DBNAME = A.DBNAME AND
          B.TSNAME = A.TSNAME AND
          A.PARTITION = B.LOGICAL_PART AND
          B.ICTYPE = 'F' AND
          B.ICDATE > CURRENT DATE - 7 DAYS
);