浏览 1670 次
锁定老帖子 主题:这个存在效率的问题?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-12-13
SQL> select interiorid, constdisplayname 2 from (select interiorid, constdisplayname 3 from globalconst 4 where globalconst = 'status') 5 where to_number(interiorid) < 4 6 order by to_number(interiorid); SQL> select interiorid, constdisplayname 2 from globalconst 3 where globalconst = 'status' 4 and to_number(interiorid) < 4 5 order by interiorid; 这2个sql语句存在执行效率不同的问题? 讨论 这个问题要不要加上optimizer_mode 一致的前提? 附: Oracle 在执行SQL语句时,有两种优化方法:即基于规则的RBO和基于代价的CBO。 在SQL执教的时候,到底采用何种优化方法,就由Oracle参数 optimizer_mode 来决定。 SQL> show parameter optimizer_mode NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ optimizer_mode string CHOOSE optimizer_mode 参数值共有以下四个: 第一:CHOOSE 这个是Oracle的默认值。采用这个值时,Oracle即可以采用基于规则RBO,也可以采用基于代价的CBO,到底使用那个值,取决于当前SQL的被访问的表中是不是有可以使用的统计信息。 如果有多个被访问的表,其中有一个或多个有统计信息,那么Oralce会对没有统计信息的表进行采样统计(即不全部采样),统计完成后,使用基于代价的优化方法CBO。 如果所有被访问的表都没有统计信息,Oracle就会采用基于规则的优化方法RBO。 第二:ALL_ROWS 不管是不是有统计信息,全部采用基于成本的优化方法CBO。 第三:FIRST_ROWS_n 不管是不是有统计信息,全部采用基于成本的优化方法CBO,并以最快的速度,返回前N行记录。 第四:FIRST_ROWS 使用成本和试探法相结合的方法,查找一种可以最快返回前面少数行的方法;这个参数主要用于向后兼容。 第五:RULE 这个参数正好和ALL_ROWS相反,不管是不是统计信息,全部采用基于规则的优化方法。 如何更改 optimizer_mode 的参数呢?可以用以下的方法。 SQL> alter session set optimizer_mode='RULE'; 会话已更改。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |