关于今天看到的1条sql语句
由于要做一个查询:
select count(*) as cnt from BUSINESS_TIP;但是执行速度很慢,并且在第一次执行之后,以后的执行依然会很慢
同事就给我说了下面这一条sql:
select /*+rule*/ count(*) as cnt from BUSINESS_TIP;执行时间减少了一半..并且再重复执行的查询速度很快...想问问高手这个是怎么回事?因为我对数据库非常的不熟...只是粗粗的了解的到 /**/是一种注释...在这里还有其他的含义吗?对了.我们用的是Oracle,听说好像是内部的什么什么定义的~~~

解决方案 »

  1.   

    /* */是oracle中的hint,通过它来指定系统使用哪种执行计划,由于hint是强制性的,所以并不是所有情况下hint都可以提高效率。常用的hint可以参考下面那个链接:
    http://oradbhome.itpub.net/post/14580/111974
      

  2.   

    HINT提示和注释的区别在于一个+,如上面的/*+ RULE*/就有一个+号。
    /*+ RULE*/提示表示本条查询语句要用到基于规则的优化,以索引为优先,这在10g里已经是过时了,10g以后只支持基于统计的优化,所以建议楼主对表BUSINESS_TIP先做一个分析,
    SQL>EXEC DBMS_STATS.GATHER_TABLE_STATS(username,'BUSINESS_TIP');然后不用提示执行
    SELECT COUNT(*) FROM business_tip;
      

  3.   

    rule的hint 应该hint是用RBO来执行,这个是不推荐的方法,不知道你的oracle版本是多少,如果RBO快于CBO的模式的话,应该需要定期做一下table和schema的statistic.
      

  4.   

    基于规则的优化器最好不用,用 analyze table 命令对你的表做一下分析看是不是管用。
      

  5.   


    /*+ RULE*/ 提示表示本条查询语句要用到基于规则的优化,以索引为优先,
      

  6.   

    打个比方,从A城市到B城市都4条路1,2,3,4可以走,自动驾驶系统认为路1是最好走的,但是我们的驾驶员觉得路2才是最方便的,虽然比1远点,但是不堵车,所以就发歌指令告诉汽车我们决定走第二条路了。这就是HINT