在Oracle中使用子SELECT查询优化SELECT

时间:2013-08-20 02:04:40

标签: sql oracle oracle11g

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扫描。

这个子查询能否以其他方式进行优化? 请帮忙。

1 个答案:

答案 0 :(得分: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表中每个乌鸦的结果。