Oracle 性能优化 — 统计数据收集

摘要:
在Oracle8及以后的版本,Oracle强列推荐用CBO的方式。在这种情况下,如果某个View用到此Table,且系统使用CBO的方式,则可能导致Oracle的optimizer给出效率低下的执行计划。OracleDB中常用的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();OracleCBO需要系统定期分析统计表/索引。因此在InstanceLevel的optimizer_mode=choose,定期运行ANALYZE或dbms_stats是非常重要的,尤其是当上次统计后,数据量已发生较大变化之后。
ORACLE优化器的优化方式有两大类,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO)。

A、 RBO方式:优化器在分析SQL语句时,更据数据库中表和索引等定义信息,遵循的是Oracle内部预定的一些规则。比如我们常见的:当一个where子句中的一列有索引时去走索引而不走全表扫描。
B、 CBO方式:依词义可知,它是看语句的代价(Cost)了。基于代价的查询,数据库根据搜集的表和索引的数据的统计信息(统计信息通过analyze 命令或者使用dbms_stats包来搜集)综合来决定选取一个数据库认为最优的执行计划(实际上不一定最优) 。统计信息给出表的大小 、有多少行、每行的长度等信息。
注意:这些统计信息起初在库内是没有的,是根据 analyze 命令或者dbms_stats包来定期搜集后才出现的,所以很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些我们应及时更新这些信息。为了使用基于成本的优化器(CBO) , 你必须经常运行analyze或dbms_stats命令,以增加数据库中的对象统计信息(objectstatistics)的准确性。
在Oracle8及以后的版本,Oracle强列推荐用CBO的方式。

1. 如何查看对象统计信息(objectstatistics)

对CBO模式,对象统计信息至关重要。如何查看对象统计信息(objectstatistics)?
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 =‘ONT’
AND table_name =‘OE_ORDER_LINES_ALL’;
TABLE_NAME NUM_ROWS BLOCKS EMPTY AVG_SPACE CHAIN_CNT AVG_ROW_LEN
OE_ORDER_LINES_ALL 5344 505 5 0 0 441可以看到数据字典中统计到的该表有5344笔记录,我们下SQL验证一下:
select count(*) fromapps.OE_ORDER_LINES_ALL;
发现返回是16518笔记录,可见这个表的统计信息是比较陈旧的,真实数据与统计到的数据有较大的差别。在这种情况下,如果某个View用到此Table,且系统使用CBO的方式,则可能导致Oracle的optimizer给出效率低下的执行计划。

此时可以用ANALYZE去重新统计OE_ORDER_LINES_ALL这个表,可以下SQL:
ANALYZE TABLE ONT.OE_ORDER_LINES_ALL COMPUTE STATISTICS;
再次Query数据字典:
TABLE_NAME NUM_ROWS BLOCKS EMPTY AVG_SPACE CHAIN_CNT AVG_ROW_LEN
OE_ORDER_LINES_ALL 16518 1530 1035 865 257 643
发现此时的信息已是最新的了。有了比较正确的统计信息,optimizer才能给出高效的执行计划。

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小的时候进行。

免责声明:文章转载自《Oracle 性能优化 — 统计数据收集》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇LocalDate获取当天,本月第一天,本月最后一天,今年第一天,今年最后一天(转)eclipse 导入Android 项目 步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

遇到联邦计算数据碰撞难题怎么办?不妨试一试PSI

摘要:随着MPC、隐私计算等概念的流行,诸多政府机构、金融企业开始考虑参与到多方计算的场景中,扩展数据的应用价值。 本文分享自华为云社区《使用PSI解决联邦计算的数据碰撞问题》,作者:breakDraw。 联邦计算场景 随着MPC、隐私计算等概念的流行,诸多政府机构、金融企业开始考虑参与到多方计算的场景中,扩展数据的应用价值。 以下面这个场景为例,银行可...

MongoDB---如何避免插入重复数据(pymongo)

以下摘自pymongo文档: update_one(filter, update, upsert=False) update_many(filter, update, upsert=False) filter: A query that matches the document to update. update: The modifications...

初识大数据(三. Hadoop与MPP数据仓库)

  MPP代表大规模并行处理,这是网格计算中所有单独节点参与协调计算的方法。 是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果。 MPP DBMS是建立在这种方法之上的数据库管理系统。在这些系统中的每个查询都会被分解为由MPP网格的节点并行执行的一组协调进程,它们的运行时间比传统的SMP RDBMS系...

重新初始化RAC的OCR盘和Votedisk盘,修复RAC系统

假设我们的RAC环境中OCR磁盘和votedisk磁盘全部被破坏,并且都没有备份,那么我们该如何恢复我们的RAC环境。最近简单的办法就是重新初始化我们的ocr盘和votedisk盘,把集群中的所有相关资源重新注册到OCR磁盘和votedisk磁盘中。 1.停掉所有节点的Clusterware Stack [root@rac3 bin]# ./crsctl...

apt 安装 Oracle Java JDK

apt 安装 Oracle Java JDK 8/10 “Linux Uprising”团队维护一个PPA存储库,其中包含适用于所有当前Ubuntu版本的Oracle Java 10安装程序。 请注意,由于授权,PPA不包含Java二进制文件。 PPA中的包自动从Oracle Web服务器下载并安装Oracle JDK 10。 在Ubuntu 18.04中...

Oracle数据库的函数,存储过程,程序包,游标,触发器

Oracle自定义函数 函数的主要特性是它必须返回一个值。创建函数时通过 RETURN 子句指定函数返回值的数据类型。函数的一些限制:● 函数只能带有 IN 参数,不能带有 IN OUT 或 OUT 参数。● 形式参数必须只使用数据库类型,不能使用 PL/SQL 类型。● 函数的返回类型必须是数据库类型 Create function 函数名称 retur...