收集统计信息
----------------------------------认识--------------------------------------------------------
统计信息:系统(数据库)或对象的描述数据的集 例如 表的行数 或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/ ,如需转载,请注明出处,否则将追究法律责任。