技术开发 频道

Oracle的优化器(Optimizer)

    3、如何设定选用哪种优化模式

    a、Instance级别

    我们可以通过在init<SID>.ora文件中设定OPTIMIZER_MODE=RULE、OPTIMIZER_MODE=CHOOSE、OPTIMIZER_MODE=FIRST_ROWS、OPTIMIZER_MODE=ALL_ROWS去选用3所提的四种方式,如果你没设定OPTIMIZER_MODE参数则默认用的是Choose这种方式。

    B、Sessions级别

    通过SQL> ALTER SESSION SET OPTIMIZER_MODE=<Mode>;来设定。

    C、语句级别

    这些需要用到Hint,比如:

    SQL> SELECT /*+ RULE */ a.userid,

    2 b.name,

    3 b.depart_name

    4 FROM tf_f_yhda a,

    5 tf_f_depart b

    6 WHERE a.userid=b.userid;

    4、为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢 ?

    A、不走索引大体有以下几个原因

    你在Instance级别所用的是all_rows的方式

    你的表的统计信息(最可能的原因)

    你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。

    B、解决方法

    可以修改init<SID>.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint.

    删除统计信息

    SQL>analyze table table_name delete statistics;

    表小不走索引是对的,不用调的。

    5、其它相关

    A、如何看一个表或索引是否是统计信息

    SQL>SELECT * FROM user_tables

    2 WHERE table_name=<table_name>

    3 AND num_rows is not null;

    SQL>SELECT * FROM user_indexes

    2 WHERE table_name=<table_name>

    3 AND num_rows is not null;

    b、如果我们先用CBO的方式,我们应及时去更新表和索引的统计信息,以免生形不切合实的执行计划。

    SQL> ANALYZE TABLE table_name COMPUTE STATISTICS;

    SQL> ANALYZE INDEX index_name ESTIMATE STATISTICS;

    具体的ANALYZE语句请参照Oracle8i/9i 的refrence文档。

0
相关文章