有两张表,一张表table1(id char(15),name_id float(126),name(50))
有2000多条记录,另一张表table2(id char(15),rq1 date,rq2 date)
有30000多条记录.现想实现在表table2中查找table2.id=table1.id 且rq1<=rq2,
并按name_id 分组的记录数,表table1中id为主键唯一,而table2中的id 不唯一,
我用以下查询,却需用一个多小时,请高手看看我的SQL是不是有什么问题,有没有
更好的办法?
select to_char(a.name_id),count(*)
  from table1 a, table2 b
 where a.id=b.id
   and b.rq1<=b.rq2
group by to_char(a.name_id)

解决方案 »

  1.   


     1.首先请确认表中的id列都有索引? 表是否已经统计过?
       输出查询计划看看 ? 2. sql语句中有显式的函数出现,而且group by 操作中
        也有函数操作,会导致full table scan. 3. 增大排序缓冲区看看?
        alter sort_area_size=1048576(1M)
        ...  
          
           
      

  2.   

    from table1 a, table2 b改成from table2 a,table1 b
    因为oracle的解析sql过程是从右往左,所以数据少的表应作为基表
    其他修改可以建立索引等
      

  3.   

    楼上说的好象是RBO的规则,如果用的是CBO的话没有用的
    同意2楼的说法,不过对1楼的使用to_char感到迷惑,
    这个to_char好象没什么用啊
      

  4.   

    create index i_tab2_id on tab2 (table2);
    create index i_tab1_id on tab2 (table1);select name_id ,count(1)  from table2 where id 
    in (select id from table1 )
    group by id_name
      

  5.   

    根据Oracle优化路径
    rule 模式下的规则:1、有两个索引存在的情况下,from后面大表在前。小表(返回记录少的表,不是记录少的表)在最后,作为驱动表,Oracle处理SQL语句是从左到右2、有一个索引,则顺序无关3、都没有索引,则大表应该在后
      

  6.   

    tochar 应该是用来处理 11111.1这样的数字的吧name_id float(126)