1
Select id,
       (Select sum(totalpay) 
          from Table2 t 
         where t.id = a.id  
           and t.transamt > 0 
           and t.paydt BETWEEN TRUNC(sysdate-0-7) and TRUNC(sysdate-0-1)) As Pay
  from Table1 a

transamt、paydt、および id にインデックスがあるにもかかわらず、Table2 のサブクエリのコストは非常に高く、FULL TABLE スキャンが必要です。

このサブクエリを他の方法で最適化できますか? 助けてください。

4

2 に答える 2

0
Select t.id,
       sum(totalpay) as Pay
  from Table2 t join Table1
 Where t.id = Table1.id
   and t.transamt > 0 
   and t.paydt BETWEEN TRUNC(sysdate-0-7) and TRUNC(sysdate-0-1)
 group by t.id
于 2013-08-20T08:08:41.850 に答える
0

これを試して:

Select a.id,
       pay.totalpay
  from Table1 a
       (Select t.id, sum(totalpay) totalpay
          from Table2 t 
         where t.transamt > 0 
           and t.paydt BETWEEN TRUNC(sysdate-0-7) and TRUNC(sysdate-0-1)
         group by t.id
       ) As Pay
 where a.id = pay.id

列 (この例では id 列) をサブクエリに結合してグループをプッシュし、Table2 のすべての値の結果を計算してから、Table1 テーブルと結合します。元のクエリでは、Table1 テーブルからすべてのカラスの結果を計算し、Table2 テーブル全体を読み取ります。

于 2013-12-13T15:39:57.363 に答える