oracle 优化学习笔记_统计信息

文章目录

  • 1.概述
  • 2.收集
    • 2.1 analyze
    • 2.2 dbms_stats
    • 2.3 区别
  • 3. 查看
  • 4.表的统计信息
  • 5.索引的统计信息
  • 6.列的统计信息
  • 7.自动收集

1.概述

存储在数据字典里,描述了oracle里对象的详细信息。
统计信息的对象包括:表、索引、列、系统、数据字典、内部对象
CBO利用这些统计信息来计算执行路径的成本,从而选择成本最小的作为最终的执行计划。

2.收集

2.1 analyze

从oracle 7 开始引入。目前生产已不常用。

计算
 analyze table test.TEST_SQLTUNE compute statistics;
删除
 analyze table test.TEST_SQLTUNE delete statistics;

2.2 dbms_stats

从oracle 8 开始引入。官方推荐,日常生产常用。

名称 说明
GATHER_TABLE_STATS 收集表、表的列、表的索引
GATHER_INDEX_STATS 收集指定索引
GATHER_SCHEMA_STATS 收集指定schema下所有对象
GATHER_DATABASE_STATS 收集全库所有对象
DELETE_TABLE_STATS 删除统计信息

对表及级联对象收集统计信息,并行度2,采样比率100%,直方图参照原有设置:

SYS@regan> execute dbms_stats.gather_table_stats(ownname => 'TEST',-
> estimate_percent => 100,-
> method_opt => 'for all columns size repeat',-
> degree => 2,-
> cascade => true,-
> TABNAME => 'TEST_SQLTUNE');

PL/SQL procedure successfully completed.

对test用户下所有对象收集,删除直方图信息:

SYS@regan> exec DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'TEST',-
> ESTIMATE_PERCENT=>10,-
> method_opt=>'for all columns size 1',-
> cascade=>true,-
> force=>true,-
> degree=>2);

PL/SQL procedure successfully completed.

2.3 区别

analyze不能正确的收集分区表的统计信息
analyze不能并行
analyze能收集CBO不相关的信息,入行迁移,行链接,校验表和索引的结构信息

3. 查看

可以使用崔华老师的脚本进行查看,京东已有电子书版的可以购买,支持正版。
http://www.dbsnake.net/wp-content/uploads/2012/08/sosi.txt

4.表的统计信息

相关视图:
DBA_TABLES、DBA_TAB_PARTITIONS、DBA_TAB_SUBPARTITIONS
相关字段:
NUM_ROWS、BLOCKS、AVG_ROW_LEN(平均行长度:所有记录占用总字节数除以表的行数)

查看历史统计信息:

select SAVTIME,ROWCNT,AVGRLN,ANALYZETIME 
from wri$_optstat_tab_history 
where OBJ#=(select object_id from dba_objects where object_name='&tab');

表在被truncate后,就会成为当天自动收集统计信息的目标。
无论analyze还是dbms_stats,都会隐式提交。

5.索引的统计信息

相关视图:
DBA_INDEXES、DBA_IND_PARTITIONS、DBA_IND_SUBPARTITONS
相关字段:
BLEVEL(索引层级,0代表有1级,也就是只有根节点)
LEAF_BLOCKS
CLUSTERING_FACTOR(聚簇因子)

聚簇因子的含义:指按照索引键值排序的索引行和存储与对应表中数据行的存储顺序的相似程度。
聚簇因子越大,在走索引范围扫描时会消耗更多的物理IO。
聚簇因子最小为LEAF_BLOCKS数量,最大为数据的行数。
当聚簇因子很大时,查询字段即使有索引,统计信息也准确,也可能会走全表扫描。

6.列的统计信息

相关视图:
DBA_TAB_COL_STATISTICS
DBA_PART_COL_STATISTICS
DBA_SUBPART_COL_STATISTICS
相关字段:
NUM_DISTINCT
NUM_NULLS
LOW_VALUE、HIGH_VALUE:如果对目标列指定的where查询条件不在该列的最大和最小值之间,就会发生谓词越界

直方图:对目标列收集直方图,即CBO认为这个列上的数据不是均匀分布的了。

--自动收集索引列上的直方图
method_opt=>'for all indexed columns size auto'
--指定列收集
for columns size auto EMPNO DEPTNO
--指定bucket数量
for columns size 10 EMPNO DEPTNO
for columns EMPNO size 10  DEPTNO size 5
--删除指定列直方图
for columns EMPNO size 1
--删除所有列
for columns size 1

直方图会影响shared cursor能否被共享,影响可选择率。
未在where条件中出现的字段,不需要收集直方图。

7.自动收集

从10g后提供自动收集功能,需要statistics_level为typical或all
自动任务:

col CLIENT_NAME for a40
col TASK_NAME for a30
col OPERATION_NAME for a40
select CLIENT_NAME,TASK_NAME,OPERATION_NAME,status from dba_autotask_task;

CLIENT_NAME                              TASK_NAME                      OPERATION_NAME                           STATUS
---------------------------------------- ------------------------------ ---------------------------------------- --------
sql tuning advisor                       AUTO_SQL_TUNING_PROG           automatic sql tuning task                ENABLED
auto optimizer stats collection          gather_stats_prog              auto optimizer stats job                 ENABLED
auto space advisor                       auto_space_advisor_prog        auto space advisor job                   ENABLED

任务所调用的包:

SYS@regan> select program_action from dba_scheduler_programs where program_name=upper('gather_stats_prog');

PROGRAM_ACTION
----------------------------------------------------------------------------------------------------------------------------------
dbms_stats.gather_database_stats_job_proc

作业窗口:
上面7个打开的窗口为11g之后使用的,下面2个关闭的窗口为10g时使用的。

SYS@regan> col WINDOW_NAME for a20
SYS@regan> col ENABLED for a10
SYS@regan> col RESOURCE_PLAN for a25
SYS@regan> col DURATION for a20
SYS@regan> col REPEAT_INTERVAL for a80
SYS@regan> SELECT WINDOW_NAME,ENABLED,RESOURCE_PLAN, DURATION, REPEAT_INTERVAL FROM DBA_SCHEDULER_WINDOWS;

WINDOW_NAME          ENABLED    RESOURCE_PLAN             DURATION             REPEAT_INTERVAL
-------------------- ---------- ------------------------- -------------------- --------------------------------------------------------------------------------
MONDAY_WINDOW        TRUE       DEFAULT_MAINTENANCE_PLAN  +000 04:00:00        freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0
TUESDAY_WINDOW       TRUE       DEFAULT_MAINTENANCE_PLAN  +000 04:00:00        freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0
WEDNESDAY_WINDOW     TRUE       DEFAULT_MAINTENANCE_PLAN  +000 04:00:00        freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0
THURSDAY_WINDOW      TRUE       DEFAULT_MAINTENANCE_PLAN  +000 04:00:00        freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0
FRIDAY_WINDOW        TRUE       DEFAULT_MAINTENANCE_PLAN  +000 04:00:00        freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0
SATURDAY_WINDOW      TRUE       DEFAULT_MAINTENANCE_PLAN  +000 20:00:00        freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0
SUNDAY_WINDOW        TRUE       DEFAULT_MAINTENANCE_PLAN  +000 20:00:00        freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0
WEEKNIGHT_WINDOW     FALSE                                +000 08:00:00        freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=22;byminute=0; bysecond=0
WEEKEND_WINDOW       FALSE                                +002 00:00:00        freq=daily;byday=SAT;byhour=0;byminute=0;bysecond=0

9 rows selected.

你可能感兴趣的:(tuning)