现在的需求是查询热门的关键字。
输入关键字查询出以此关键字开头的的前4条内容,中间包含这个关键字的3条内容,以关键字结尾的3条内容。
我现在写的SQL是这样的,很慢。。
希望可以帮我优化一下。--1.查询以关键字a开头的4条记录
 select * from 
 (
 
 (select tt.*,rownum,'1' rr from 
(select t.tone_name, sum(t.order_times) c from t_rbt_search_tone t 
where t.tone_type = '2' and (t.tone_name like 'a%' or t.py_tone_name like 'a%' or t.abb_tone_name like 'a%')
group by t.tone_name order by c desc) tt
where rownum < 5)  
      union
--2.查询中间包含关键字a的3条记录
(select tt.*,rownum,'2' rr from 
(select t.tone_name, sum(t.order_times) c from t_rbt_search_tone t 
where t.tone_type = '2' and (t.tone_name like '%a%' or t.py_tone_name like '%a%' or t.abb_tone_name like '%a%')
group by t.tone_name order by c desc) tt
where rownum < 4) 
--3.查询以关键字a结尾的3条记录
     union 
(select tt.*,rownum,'3'as rr from 
(select t.tone_name, sum(t.order_times) c from t_rbt_search_tone t 
where t.tone_type = '2' and (t.tone_name like '%a' or t.py_tone_name like '%a' or t.abb_tone_name like '%a')
group by t.tone_name order by c desc) tt
where rownum < 4) 
)
 order by rr,c desc
;

解决方案 »

  1.   

    union 最好 union all
     
      

  2.   

    优化的定义并不是说凭感觉改改SQL就可以了,这些跟你的机器性能,网络环境还有数据表,存储环境的设置都有很大的关系。单方面可以分步骤的进行修改。针对SQL的话,建议采用执行计划,用EXPLAIN或者SET AUTOTRACE ON来看看,也可以使用SQL_TRACE监测,然后用TKPROF按照执行语句占用性能排序,分析出执行计划。
      

  3.   

    like 'a%'可以用到索引.
    like '%a%'和like '%a'不用用索引,索引慢.
      

  4.   

    dawugui哥哥还来oracle版块啊
    顶一个
      

  5.   

       只从SQL语句看,可以把UNION改成UNION ALL,t_rbt_search_tone这张表大不大,你的语句要重复扫描这张表三次,可以考虑减少访问该表的次数...
      

  6.   

    这个我知道,请问有没有在SQL上做优化呢?!
      

  7.   

    dawugui 各个  oracle 板块的分数还不少,orz
      

  8.   

    with a as (select * from t_rbt_search_tone t 
    where t.tone_type = '2' and (t.tone_name like '%a' or t.py_tone_name like '%a' or t.abb_tone_name like '%a')
    group by t.tone_name order by c desc)
    select * from ....使用with,利用tone_type = '2'的索引,唉
      

  9.   

    你试一下在tone_name字段上建一个函数索引create index idx_tone_name on t_rbt_search_tone (instr(tone_name,'热门'));然后查看一下执行计划,是否有提速