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 表连接。在原始查询中,您从读取完整 Table2 表的 Table1 表中计算每个乌鸦的结果。

于 2013-12-13T15:39:57.363 回答