我有两个大表需要联合查询,card 和 account
其中两个表都有一个字段为account_id,且用这个字段关联,都建了索引
card表约2000万条,account表约1亿条查询语句:  select * from
 (SELECT  *  FROM  card a, account b WHERE account_id = c.account_id and b.account_name = '王茜'  order by c.done_date desc  ) 
        
 where   ROWNUM <= 500 执行计划已经走了两个的索引,可是查询结果还是要60秒,而且越是常见的名字也就是符合条件的越多,查询越慢
请教各位大虾怎样才能优化这个查询的速度?

解决方案 »

  1.   

    你看能不能建个索引给account_name 这个字段.然后用下面的执行看行不行.
    select * from 
      (
       select *,rank_desc() over(order by done_date) as no
         from account b,card a
        where b.account_id = a.account_id ) c
    where c.no<=500
                       
      

  2.   

    关键的索引应该还要包括done_date,
    几个亿的数据,进行单个条件的筛选,相信结果集应该不小,之后的排序是非常耗时的操作,如果能建立包含done_date降序的索引,那么访问路径只需经Index就可以满足,而无需运行中的额外排序操作.
      

  3.   

    另外select *的写法好象有点恐怖哟.
    鬼知道你要的结果规模有多大,从性能优化上考虑永远不要获取比你所需要的多的数据,
    因为获取任何一个多余的列数据都有可能无法由能引起更小IO的索引访问路径直接获得你所需要的数据,于是优化器只能选择更糟糕的访问路径,导致整个执行计划受影响