三个表简单的关联查询,但是速度挺慢的。
a表的数据稍大点。1000万左右,列有10多个,
关联的字段是id已经在id 上建立了索引
a表11个字段 id,a1,a2,a3...a10,假设有1000多万条数据
b表3个字段id,b1,b2
c表3个id,c1,c2select a.id,sum(a.a1),sum(b.b1),sum(c.c1),max(a.a10) from a,b,c where 
a.id=b.id and
a.id=c.id
group by a.id按上面的SQL 我在a表的ID上建立了索引。
还是很慢。一次80多秒。
我可能还要在group里加一项。group by a.id,a.a1
怎么能优化点,谢谢。C表无用,只是做例子多关联了下。

解决方案 »

  1.   

    A表建复合索引,create index idx_a_id_a1 on a(id, a1);
      

  2.   

    我已经在a上建立了索引。create index idx_a_id_a1 on a(id, a1,a2);可能group by的项都写进去了
    还是很慢
    还有那地方要写的吗
      

  3.   

    max 和sum一起用,你想得到什么结果呢,检查下业务逻辑先
      

  4.   

    oracle好像没有聚集索引,普通索引对groupby是没有作用的。
      

  5.   

    LZ没在B、C表上建索引吗?这样对B、C表要全表扫描了。你先把执行计划贴出来。
      

  6.   

    不修改物理结构,就这样的语句,是无法优化的。
    没有where语句,绝对的全表扫描,索引是没有意义的。如果有什么可以改进的看看能否把表空间整理了! 减少碎片和不必要的i/o.   
      

  7.   

    select语句没有办法优化了。是全表扫描,索引是不起作用的。修改物理结构进行优化吧!
      

  8.   

    加一个A表的汇总表 A_SUM,不用group by a.id 了,group by很耗资源的,数据量也会少很多!!
    哈哈,叫客户再花点钱,硬件性能提高上去 
      

  9.   

    b表和c表的id字段如果没有建立索引,那么先在id 上建立索引。
    将表起别名,将别名作为前缀加在各查询字段上。
    a表连接b表和c表,那么a表是交叉表,将交叉表做为基础表放在b、c后,如from b,c,a如果无其他过滤条件,1000多万条记录的扫描,几十秒应该很正常吧