自动收集和手工收集统计数据信息讲解

自动收集和手工收集统计信息讲解


撒子是自动统计数据喔???
show parameter optimizer_mode;
--查看当前数据库CBO优化方式,默认all_rows方式


select job_name,state,owner from dba_scheduler_jobs;
--查看当前调度程序的运行状态,scheduled表示正在被调用


JOB_NAME                       STATE           OWNER
------------------------------ --------------- ---------------
RLM$EVTCLEANUP                 SCHEDULED       EXFSYS
RLM$SCHDNEGACTION              SCHEDULED       EXFSYS
MGMT_CONFIG_JOB                SCHEDULED       ORACLE_OCM
MGMT_STATS_CONFIG_JOB          SCHEDULED       ORACLE_OCM
PURGE_LOG                      SCHEDULED       SYS
FILE_WATCHER                   DISABLED        SYS
ORA$AUTOTASK_CLEAN             SCHEDULED       SYS
HM_CREATE_OFFLINE_DICTIONARY   DISABLED        SYS
DRA_REEVALUATE_OPEN_FAILURES   SCHEDULED       SYS
BSLN_MAINTAIN_STATS_JOB        SCHEDULED       SYS
FGR$AUTOPURGE_JOB              DISABLED        SYS

JOB_NAME                       STATE           OWNER
------------------------------ --------------- ---------------
RSE$CLEAN_RECOVERABLE_SCRIPT   SCHEDULED       SYS
SM$CLEAN_AUTO_SPLIT_MERGE      SCHEDULED       SYS
XMLDB_NFS_CLEANUP_JOB          DISABLED        SYS


调度程序的规则:
oralcescheduler维护窗口的周一到周五晚上十点到早上六点以及周末的全体打开
不是所有对表的所有行进行统计,根据内部算法实现一个采样百分比
不是维护窗口内部所有的表收集统计数据,没有变化的表只收集一次
对于新表的第一次统计会统计该表的所有数据行

select last_analyzed,table_name,owner,num_rows,sample_size from dba_tables where owner='SCOTT';
--查询scott用户分析表的情况
LAST_ANALYZED  TABLE_NAME                     OWNER                            NUM_ROWS SAMPLE_SIZE
-------------- ------------------------------ ------------------------------ ---------- -----------
16-10月-13     PAGE                           SCOTT                               71921       71921
14-10月-13     SALGRADE                       SCOTT                                   5           5
14-10月-13     BONUS                          SCOTT                                   0           0
14-10月-13     EMP                            SCOTT                                  14          14
14-10月-13     DEPT                           SCOTT                                   4           4
--num_rows说明该表具有的行数
--sample_size说明统计的采样行数,因为是第一次对该表分析,所以对所有行进行统计

 

撒子是手工统计数据喔???
使用DBMS_STATS包手工收集统计数据,其实自动收集的gather_stats_job作业本质上也是使用包来实现收集的,区别看是否是oralce

自动执行的内部行为。

dbms_stats包提供几种过程来统计不同粒度的数据,分为统计数据库,模式,表以及索引,如下:
gather_database_statistics   为全库表的表统计数据
gather_schema_statistics      为某个模式统计数据
gather_table_statistics      为某个特定的表收集统计数据
gather_index_statistics    为某个索引表统计数据
统计数据会存储在dba_tab_statistics 和 dba_tab_col_statistics数据字典中

例如:
为模式scott的所有表统计数据
exec dbms_stats.gather_schema_stats(ownname => 'SCOTT');
PL/SQL 过程已成功完成。

--查询scott用户分析表的情况
select last_analyzed,table_name,owner,num_rows,sample_size from dba_tables where owner='SCOTT';
LAST_ANALYZED  TABLE_NAME                     OWNER                            NUM_ROWS SAMPLE_SIZE
-------------- ------------------------------ ------------------------------ ---------- -----------
19-10月-13     DEPT                           SCOTT                                   4           4
19-10月-13     EMP                            SCOTT                                  14          14
19-10月-13     BONUS                          SCOTT                                   0           0
19-10月-13     SALGRADE                       SCOTT                                   5           5
19-10月-13     PAGE                           SCOTT                               71921       71921


为scott下面的表emp统计数据
exec dbms_stats.gather_table_stats( 'SCOTT','EMP');
PL/SQL 过程已成功完成。


为dept的索引统计数据
select index_name,table_name from dba_indexes where owner ='SCOTT';
exec dbms_stats.gather_index_stats('SCOTT','PK_DEPT');
PL/SQL 过程已成功完成。

select last_analyzed,INDEX_NAME from dba_INDEXES where owner='SCOTT';
--验证索引是否被统计
LAST_ANALYZED  INDEX_NAME
-------------- -----------------
19-10月-13     PK_DEPT
19-10月-13     PK_EMP
19-10月-13     IDX_PAGE
19-10月-13     IDX_PAGE_1
19-10月-13     IDX_PAGE_2
19-10月-13     IDX_PAGE_3


show parameter job_queue_processes;
--如果该参数为0,则统计信息包不会工作,
需要设置参数
alter system set job_queue_processes=20 scope=both;

 


如何手工收集整个数据库的统计数据???
begin
dbms_stats.gather_database_stats(estimate_percent=>null);
edn;
/


 

你可能感兴趣的:(优化,统计数据)