Oracle优化器的优化分为两类,即基于规则的优化方式(Rule-Based Optimization,简称RBO)和基于代价的优化方式(Cost-Based Optimization,简称CBO)
1. RBO方式:优化器在分析SQL语句时,根据数据库中表和索引等定义信息,遵循的是Oracle内部预定的一些规则。比如我们常见的:当一个where 子句中的一列有索引时去走索引而不走全表扫描。
2. CBO方式:它是看语句的代价(cost)。基于代价的查询,数据库根据收集的表和索引的数据统计信息(统计信息通过analyze 命令或使用dbms_stats包来搜集)综合来决定选取一个数据库认为最优的执行计划(实际上不一定是最优)。统计信息给出表的大小、有多少行、每行的长度等信息。
注意:这些统计信息起初在库内是没有的,是根据analyze命令或者dbms_stats包来定期搜集后才出现的,所以很多的时候过期统计信息会令优化器做出一个错误的执行计划,因此我们需要及时的更新这些信息。为了使用基于成本的优化器(CBO),需要经常的运行analyze或dbms_stats命令,以增加数据库中的对象统计信息(object statistics)的准确性。
在oracle8以后的版本,oracle强烈推荐使用CBO方式。
1. 如何查看对象统计信息(object statistics)
对CBO模式,对象统计信息至关重要。如何查看对象统计信息(object statistics)
Oracle中关于表的统计信息是在数据字典中的,可以用以下SQL查询到,eg:
SELECT table_name,num_rows, blocks, empty_blocks AS empty, avg_space, chain_cnt, avg_row_len
FROM dba_tables
WHERE owner ='schema'
AND table_name ='xxxxx'
在输出的结果中查看num_rows的值与以下sql的输出结果进行比较,如果差别较大就需要进行更新。
我们下SQL验证一下:
select count(*) from schema.table_name;
在差别较大的情况下,如果某个View用到此Table,且系统使用CBO的方式,则可能导致Oracle的optimizer给出效率低下的执行计划。
此时可以用ANALYZE去重新统计xxxxx这个表,可以下SQL:
ANALYZE TABLE schema.xxxxx COMPUTE STATISTICS;
2. 并发请求: 统计数据收集模式(FNDGSCST) / Gather Schema Statistics
Oracle ERP中有几个与Gather有关的标准Request:
Gather All Column Statistics –FND_STATS.GATHER_ALL_COLUMN_STATS()
Gather Column Statistics –FND_STATS.GATHER_COLUMN_STATS()
Gather Schema Statistics –FND_STATS.GATHER_SCHEMA_STATS()
Gather Table Statistics –FND_STATS.GATHER_TABLE_STATS()
查看FND_STATS 这个Package的写法,其实它就是在调用Oracle DB中Standard的Package dbms_stats 中的某些Function。
Oracle DB中常用的Gather有以下一些,DBA也可以直接在Database级别上定期Run这些Function,以便能让Oracle统计到最新的数据库状况:
dbms_stats.gather_database_stats();
dbms_stats.gather_schema_stats();
dbms_stats.gather_table_stats();
dbms_stats.gather_index_stats();
Oracle CBO需要系统定期分析统计表/索引。 只有这样CBO才能使用正确的SQL访问路径,提高查询效率。 因此在Instance Level的optimizer_mode = choose ,定期运行ANALYZE 或dbms_stats是非常重要的,尤其是当上次统计后,数据量已发生较大变化之后。
注意:统计操作是很耗资源的动作,要在系统Loading小的时候进行。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21374452/viewspace-2129472/
,如需转载,请注明出处,否则将追究法律责任。