尽量让having count(distinct time) >= 3这个条件在GROUP BY以前生效,这样能够过滤掉很多数据,减少GROUP BY 的数据量

解决方案 »

  1.   

    回1楼,你不group by ,怎么来having?
      

  2.   

    表A比较大,大概在千万级数据,但建了分区,1天一个分区
    表B小,大概上万的数据。
    表A建的索引为time,cid,city这3个索引
    表B建的索引为city_code,cid这2各索引
    A走的是time上的索引
      

  3.   

    可以考虑用/*+LEADING(TABLE)*/把B表作为驱动表试一下。
      

  4.   

    我觉得应该先走分区再走索引会比较合理。
    select count(*)
    from TABLEA
    where a.time >= 1384444800
       and a.time <= 1384963200 的结果是多少?
      

  5.   

    我觉得应该先走分区再走索引会比较合理。
    select count(*)
    from TABLEA
    where a.time >= 1384444800
       and a.time <= 1384963200 的结果是多少?
    一天400多万,7天大概2000多万,3000万的样子
      

  6.   

    a.cid = b.cid
    这两个有索引吗,CITY_CODE可以做成位图索引
      

  7.   

    我觉得应该先走分区再走索引会比较合理。
    select count(*)
    from TABLEA
    where a.time >= 1384444800
       and a.time <= 1384963200 的结果是多少?
    一天400多万,7天大概2000多万,3000万的样子
    这个数据量能否想办法降级呢?
    比如先在TABLEA上group 你所需要的字段。然后结果再与tableB 关联。
      

  8.   

    如果两张表都很大最好是hash join, 你这个走NEST
      

  9.   

    如果两张表都很大最好是hash join,看的执行计划 你这个走NESTED LOOP JOIN, 
    并且应该是选择了你的A表做驱动表,而对于你的驱动表A,oralce会对A进行全扫描,那么你A表
    这么大扫起来肯定会慢,事实上应该将你的小表做驱动表,全扫描一次很快,然后基于B的数据,A表上有相应的索引去fetch数据这是正常逻辑,所以方案是:
    1.将你的B表作为驱动表,加个hint:/*+ ordered use_nl (B A)*/
    2.在你的A表上对相关的连接字段建立合适的索引,最好那个字段是有唯一性或者高选择性
      

  10.   

    怎么在执行计划里看不到你的filter? group by 和order by 都是要排序的,相关的字段建立索引会比较好,因为索引是有序的,所以排起来会很快。 再一个你这个0513 是固定的吗? 要是固定的就写=号吧。