1. 程式人生 > >避免笛卡爾積現象方式一

避免笛卡爾積現象方式一

1 主要SQL語句

SELECT *

  FROM (
       
        SELECT row_.*,
               
                rownum rownum_
       
          FROM (
                 
                  SELECT matnr,
                         
                          maktx,
                         
                          lgort,
                         
                          lgobe,
                         
                          charg,
                         
                          labst,
                         
                          meins,
                         
                          matkl,
                         
                          wgbez,
                         
                          brgew,
                         
                          mtart,
                         
                          gewei,
                         
                          menge AS qty,
                         
                          holdQty
                 
                    FROM rtl_inventory_freed ri
                 
                   WHERE EXISTS
                 
                   (
                         
                          SELECT 'x'
                         
                            FROM rtl_sys_permission_inv pi
                         
                           WHERE pi.tenantCode = ri.tenantCode
                               
                             AND pi.lgort = ri.lgort
                               
                             AND pi.werks = ri.werks
                               
                             AND pi.userID = :1
                         
                          )
                       
                     AND tenantCode = :2
                       
                     AND werks = :3
                       
                     AND vkorg = :4
                       
                     AND vtweg = :5
                       
                     AND datuv <= :6
                       
                     AND sortf >= :7
                 
                  )
               
                row_
       
        )

 WHERE rownum_ BETWEEN 1 AND 50

2 檢視其執行

出現笛卡爾積現象

計劃

2  修改SQL語句,加/*+ ordered */

SELECT *

  FROM (
       
        SELECT row_.*,
               
                rownum rownum_
       
          FROM (
                 
                  SELECT /*+ ordered */ matnr,
                         
                          maktx,
                         
                          lgort,
                         
                          lgobe,
                         
                          charg,
                         
                          labst,
                         
                          meins,
                         
                          matkl,
                         
                          wgbez,
                         
                          brgew,
                         
                          mtart,
                         
                          gewei,
                         
                          menge AS qty,
                         
                          holdQty
                 
                    FROM rtl_inventory_freed ri
                 
                   WHERE EXISTS
                 
                   (
                         
                          SELECT 'x'
                         
                            FROM rtl_sys_permission_inv pi
                         
                           WHERE pi.tenantCode = ri.tenantCode
                               
                             AND pi.lgort = ri.lgort
                               
                             AND pi.werks = ri.werks
                               
                             AND pi.userID = :1
                         
                          )
                       
                     AND tenantCode = :2
                       
                     AND werks = :3
                       
                     AND vkorg = :4
                       
                     AND vtweg = :5
                       
                     AND datuv <= :6
                       
                     AND sortf >= :7
                 
                  )
               
                row_
       
        )

 WHERE rownum_ BETWEEN 1 AND 50

2 檢視執行計劃

計劃

注:笛卡爾積現象消失。

總結:

   1 子查詢容易造成笛卡爾積現象

   2 /*+ ordered */ 按在from從句中出現順序連線表