撒子是自动统计数据喔???
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;
/