ITPub博客

首页 > Linux操作系统 > Linux操作系统 > gather statistics

gather statistics

原创 Linux操作系统 作者:ad007520 时间:2010-07-02 00:32:36 0 删除 编辑

收集统计信息
----------------------------------认识--------------------------------------------------------
统计信息:系统(数据库)或对象的描述数据的集 例如 表的行数  或IO 吞吐量等 快照视为收集统计信息的行为
查询优化器用它评估
1、谓词的选择性
2、各种执行计划的代价
3、访问方式及连接方式
4、CPU/IO的代价
最终选择出oracle认为最优的执行计划
对象并非常量,需经常更新统计信息,更新工作可以由oracle自动完成也可以使用内建包dbms_stats手工收集
对象统计信息分:
表统计信息
   行数  块数  行平均长度
列统计信息
   ndv number of distinct value 、空值数、直方图(数据的分布图)
索引统计信息
   叶块数、层次(level)
系统统计信息
   cpu/io的使用情况及性能
----------------------------------收集--------------------------------------------------------
自动收集机制
  是通过定义了job 自动收集
  oracle根据自己的判断定义要自动收集统计信息的对象,但是有时难免遗漏部分对象或需自定义收集
就需要手动收集。自动收集机制可以避免因对象缺少或过时的统计信息导致优化器选择糟糕的执行计划
通过对DML的监控判断对象数据的更新及收集统计信息。
JOB:gather_stats_job
验证job
select owner,job_name,enable from dba_scheduler_jobs where job_name='GATHER_STATS_JOB';
使用dbms_scheduler.disable/enable('GATHER_STATS_JOB')启动禁用自动收集的job
涉及到oracle scheduler。。待续
手动收集
   听老人说。8i前analyze是专门用来收集对象的统计信息。到后面版本还可以继续沿用
   细化的没有怎么研究 知道
   analyze table tab_clause  compute statistics;
   or
   analyze table tab_clause  estimate statistics sample xx percent;--可以是比例 也可以是制定行数
   附 语法:
   ANALYZE
{ TABLE [ schema.]table
[ PARTITION ( partition ) | SUBPARTITION ( subpartition ) ]
| INDEX [ schema. ]index
[ PARTITION ( partition ) | SUBPARTITION ( subpartition ) ]
| CLUSTER [ schema. ]cluster
}
{ COMPUTE [ SYSTEM ] STATISTICS [for_clause]
| ESTIMATE [ SYSTEM ] STATISTICS [for_clause][SAMPLE integer { ROWS | PERCENT }]
| validation_clauses
| LIST CHAINED ROWS [ into_clause ]
| DELETE [ SYSTEM ] STATISTICS
} ;
不过现在一般都用dbms_stats 这个更强大。。
With the DBMS_STATS package you can view and modify optimizer statistics gathered for database objects.
The statistics of interest to be viewed or modified can reside in the dictionary or
in a table created in the user's schema for this purpose
话说统计信息可以转储在数据字典 也可以存入自定义表中
自定义表的结构。。。。oracle 提供了定义的过程(DBMS_STATS.CREATE_STAT_TABLE)
DBMS_STATS.CREATE_STAT_TABLE (
  ownname  VARCHAR2,
  stattab  VARCHAR2,
  tblspace VARCHAR2 DEFAULT NULL);
create table STATTAB--这个是我用上面过程创建的表
(
  STATID  VARCHAR2(30),
  TYPE    CHAR(1),
  VERSION NUMBER,
  FLAGS   NUMBER,
  C1      VARCHAR2(30),
  C2      VARCHAR2(30),
  C3      VARCHAR2(30),
  C4      VARCHAR2(30),
  C5      VARCHAR2(30),
  N1      NUMBER,
  N2      NUMBER,
  N3      NUMBER,
  N4      NUMBER,
  N5      NUMBER,
  N6      NUMBER,
  N7      NUMBER,
  N8      NUMBER,
  N9      NUMBER,
  N10     NUMBER,
  N11     NUMBER,
  N12     NUMBER,
  D1      DATE,
  R1      RAW(32),
  R2      RAW(32),
  CH1     VARCHAR2(1000)
)
包中的过程有如下几大类:
Gathering Optimizer Statistics
Setting or Getting Statistics
Deleting Statistics
Transferring Statistics
Locking or Unlocking Statistics
Restoring and Purging Statistics History
User-Defined Statistics
Pending Statistics
Comparing Statistics
Extended Statistics
透过它来分析其中几个重要的参数
DBMS_STATS.GATHER_TABLE_STATS (
   ownname          VARCHAR2,
   tabname          VARCHAR2,
   partname         VARCHAR2 DEFAULT NULL,--Name of partition.
   estimate_percent NUMBER   DEFAULT to_estimate_percent_type
                                                (get_param('ESTIMATE_PERCENT')),
   block_sample     BOOLEAN  DEFAULT FALSE,
   method_opt       VARCHAR2 DEFAULT get_param('METHOD_OPT'),
   degree           NUMBER   DEFAULT to_degree_type(get_param('DEGREE')),
   granularity      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
   cascade          BOOLEAN  DEFAULT to_cascade_type(get_param('CASCADE')),
   stattab          VARCHAR2 DEFAULT NULL,
   statid           VARCHAR2 DEFAULT NULL,
   statown          VARCHAR2 DEFAULT NULL,
   no_invalidate    BOOLEAN  DEFAULT  to_no_invalidate_type (
                                     get_param('NO_INVALIDATE')),
   force            BOOLEAN DEFAULT FALSE);
(1)estimate_percent 
samping 抽样  对于某些大表来说 如果每次都全表扫描收集统计信息 将相当的消耗资源 这是oracle就推荐我们用sampling
这个参数的默认值是 get_param('estimate_percent')
SQL> select  dbms_stats.get_param('estimate_percent') from dual;
 
DBMS_STATS.GET_PARAM('ESTIMATE
--------------------------------------------------------------------------------
DBMS_STATS.AUTO_SAMPLE_SIZE
DBMS_STATS.AUTO_SAMPLE_SIZE意味这oracle能根据不同的对象选择最合适的取样值。给这个参数赋一个常量值,
例如我把estimate_percent 置为10 而被统计的表可能有上千万的数据,这时oracle可能认为取样10%不足以
评估表,那就会自动提供取样值。
(2)degree  这个类似于上面那个
SQL> select  dbms_stats.get_param('degree') from dual;
 
DBMS_STATS.GET_PARAM('DEGREE')
--------------------------------------------------------------------------------
NULL

???null???默认怎么会是空。。奇怪 。(*********留意********)
SQL> exec dbms_stats.set_param('degree',dbms_stats.AUTO_DEGREE);
 
PL/SQL procedure successfully completed
 
SQL> select  dbms_stats.get_param('degree') from dual;
 
DBMS_STATS.GET_PARAM('DEGREE')
--------------------------------------------------------------------------------
32768

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21993926/viewspace-666893/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: sqlplus review
请登录后发表评论 登录
全部评论

注册时间:2009-06-28

  • 博文量
    137
  • 访问量
    287976