当前位置:  数据库>oracle

Oracle Statistic 统计信息小结

    来源: 互联网  发布时间:2017-04-06

    本文导语: 一.  Statistic 说明             Oracle 官网对Statistic 有详细说明,参考:             Managing Optimizer Statistics             http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/stats.htm#sthref1068                    ...

一.  Statistic 说明

           

Oracle 官网对Statistic 有详细说明,参考:

            Managing Optimizer Statistics

            http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/stats.htm#sthref1068 

                       

            Statistic 对Oracle 是非常重要的。 它会收集数据库中对象的详细信息,并存储在相应的数据字典里。 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划。

            在9i 及之前的版本,在选择执行计划的时候会根据RBO(Rule-BasedOptimization)或者CBO来分析。 10g及以后版本只支持CBO(Cost-BasedOptimization)。 这部分内容,参考第二节。

 

 

优化器收集的统计信息包括如下内容:

            1)Table statistics

                        Number of rows

                        Number of blocks

                        Average row length

            2)Column statistics

                        Number of distinct values (NDV) in column

                        Number of nulls in column

                        Data distribution (histogram)

            3)Index statistics

                        Number of leaf blocks

                        Levels

                        Clustering factor

            4)System statistics

                        I/O performance and utilization

                        CPU performance and utilization

 

            Oracle Statistic 的收集,可以使用analyze 命令,也可以使用DBMS_STATS 包来收集,Oracle 建议使用DBMS_STATS包来收集统计信息,因为DBMS_STATS包收集的更广,并且更准确。 analyze 在以后的版本中可能会被移除。

 

有关DBMS_STATS包的使用,参考如下Blog 的第三节:

            Oracle 分析及动态采样

           

 

analyze 命令的语法如下:

            SQL>analyze table tablename compute statistics;

            SQL>analyze table tablename compute statistics for all indexes;

            SQL>analyze table tablename delete statistics

 

 

            Oracle 的Statistic 信息的收集分两种:自动收集和手工收集。 在这里,我们看一下自动收集的部分。 其他内容参考Oracle 的联机文档。

 

            Oracle 的Automatic Statistics Gathering 是通过Scheduler 来实现收集和维护的。 Job 名称是GATHER_STATS_JOB, 该Job收集数据库所有对象的2种统计信息:

            (1)Missing statistics(统计信息缺失)

            (2)Stale statistics(统计信息陈旧)

 

            该Job 是在数据库创建的时候自动创建,并由Scheduler来管理。Scheduler 在maintenance windows open时运行gather job。 默认情况下,job 会在每天晚上10到早上6点和周末全天开启。该过程首先检测统计信息缺失和陈旧的对象。然后确定优先级,再开始进行统计信息。

 

            Scheduler Job的 stop_on_window_close 属性控制GATHER_STATS_JOB 是否继续。该属性默认值为True. 如果该值设置为False,那么GATHER_STATS_JOB 会中断, 而没有收集完的对象将在下次启动时继续收集。

 

            Gather_stats_job 调用dbms_stats.gather_database_stats_job_proc过程来收集statistics 的信息。 该过程收集对象statistics的条件如下:

            (1)对象的统计信息之前没有收集过。

            (2)当对象有超过10%的rows 被修改,此时对象的统计信息也称为stale statistics。

 

查看该Job 信息:

SQL> select job_name, program_name,enabled,stop_on_window_close  from dba_scheduler_jobs where job_name = 'gather_stats_job';

 

job_name                  program_name   enabl  stop_on_window_close

-------------------- --------------------  ----- --------------------

gather_stats_job  gather_stats_prog    true  true

 

 

 

监控参数 STATISTICS_LEVEL:

            为了决定是否对对象进行监控,Oracle 提供了一个参数STATISTICS_LEVEL。

            通过设置初始化参数 STATISTIC_LEVEL 为 TYPICAL 或 ALL,就可以自动收集统计信息(默认值为 TYPICAL,因此可以随即启用自动收集统计信息的功能)。STATISTIC_LEVEL 参数的值可以激活GATHER_STATS_JOB。

 

            在10g中表监控默认是激活的,如果STATISTICS_LEVEL设置为basic,不仅不能监控表,而且将禁掉如下一些10g的新功能:

            (1)ASH(Active Session History)

            (2)ASSM(Automatic Shared Memory Management)

            (3)AWR(Automatic Workload Repository)

            (4)ADDM(Automatic Database Diagnostic Monitor)

 

SQL> show parameter statistics_level

 

NAME            TYPE        VALUE

------------------------- ----------- ------------------------------

statistics_level      string      TYPICAL

 

            当启动对象的监控后,从上次统计信息收集之后的的信息,如inserts,updates,deletes 等,这些改变的信息会记录到 user_tab_modifications 视图。

            当对象的数据发生改变之后, 经过几分钟的延时,这些信息写入到user_tab_modifications视图,然后dbms_stats.flush_database_monitoring_info过程就会发现这些信息,并讲这些信息保存在内存中。

            当监控的对象被修改的部分超过10%时, gather_database_stats 或者 gather_schema_stats 过程就会去收集这些stale statistics.

 

停用该Job:

            默认情况下,该Job是enable的。统计信息的收集是资源相当密集的工作,所以在某些情况下,就不希望它自动去收集,而考虑选择手动来收集。 这中情况下,我们可以设置statistics_level 为Basic,禁用对对象的监控,但是这样也会禁用AWR等信息的收集,这种情况下,我们就可以使用可以使用如下语句:

 

BEGIN

  DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');

END;

/

 

系统用户统计信息的收集:

            如果想收集system schemas的统计信息,可以使用dbms_stats.gather_dictionary_stats过程。 该过程会收集所有system schemas,包括SYS和SYSTEM,和一些其他的chemas,如CTXSYS和 DRSYS.

 

DBMS_STATS 包里的statistics 过程:

 

Procedure

Collects

GATHER_INDEX_STATS

Index statistics

GATHER_TABLE_STATS

Table, column, and index statistics

GATHER_SCHEMA_STATS

Statistics for all objects in a schema

GATHER_DICTIONARY_STATS

Statistics for all dictionary objects

GATHER_DATABASE_STATS

Statistics for all objects in a database

 

 

有关统计信息的其他内容,比如统计信息的删除,锁定,还原等参考Blog:

            Oracle 分析及动态采样

           

 

 

 

二.  CBO 与 RBO

 

RBO 在Oracle 9i 及之前的版本使用。

CBO 在Oracle 10g及以后的版本中使用。

 

在这里提一下几点注意的地方:

 

(1) 执行计划中的 Cost的计算方式默认为CPU+I/O两者之和。 所以一般我们看执行计划是,cost 越低,SQL 的性能就越好。

 

(2)Oracle使用Optimizer_mode参数来控制优化器的偏好:

                        9i常用的参数有:first_rows,all_rows,first_rows_n,rule,choose。

                        10g和11g: 就只有first_rows,all_rows,first_rows_n,少了rule和choose。

 

            Oracle 在10g及以后的版本已经不支持RBO了。所以这里RBO对应的模式也取消了。

 

各种Mode 说明:

Rule

基于规则的方式

Choose

指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。

First Rows

The optimizer uses a mix of costs and heuristics to find a best plan for fast delivery of the first few rows.

All Rows

10g和11g中的默认值,The optimizer uses a cost-based approach for all SQL statements in the session and optimizes with a goal of best throughput (minimum resource use to complete the entire statement).

first_rows_n

 

The optimizer uses a cost-based approach and optimizes with a goal of best response time to return the first n rows (where n = 1, 10, 100, 1000).

 

 

修改optimizer_mode:

            sql>alter session set optimizer_mode=first_rows/all_rows

 

(3)OPTIMIZER_INDEX_COST_ADJ参数

            参数OPTIMIZER_INDEX_COST_ADJ可以理解为Oracle执行多块(MultiBlock)I/O(比如全表扫描)的代价与执行单块(Single-block)I/O代价的相对比例。

            OPTIMIZER_INDEX_COST_ADJ通过指明索引I/O代价与扫描全表I/O代价的相对比值来影响CBO的行为,取值越小,CBO越倾向于使用索引,取值越大,越倾向于全表扫描。而缺省值100,指明缺省下,二者的代价是相等。

 

            该参数从某种意义上来说可以决定使用使用索引,如果统计信息准确,但是执行计划又没走索引,可以将该值调小一点。

 

            OPTIMIZER_INDEX_COST_ADJ lets you tune optimizer behavior for access path selection to be more or less index friendly—that is, to make the optimizer more or less prone to selecting an index access path over a full table scan.

            The default for this parameter is 100 percent, at which the optimizer evaluates index access paths at the regular cost. Any other value makes the optimizer evaluate the access path at that percentage of the regular cost. For example, a setting of 50 makes the index access path look half as expensive as normal.

 

 

 

注意:

            9i中,如果相关的segment(表段,索引段等)没有做统计分析的时候,会选择走RBO。

            10g以后版本,如果segment 没有统计信息,那么Oracle 会使用动态采样来收集统计的信息。 这个信息不是很准确,但也可以提供一定的参考。

 

有关动态采样的信息参考:

            Oracle 分析及动态采样

           


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle中关数据库对象的统计分析
  • oracle数据库下统计专营店的男女数量的语句
  • Oracle统计信息的导出与导入
  • oracle表空间中空表统计方法示例介绍
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3