• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Oracle数据库统计信息方法详解

    发布者: Error | 发布时间: 2025-6-18 09:29| 查看数: 93| 评论数: 0|帖子模式

    一、统计信息查看

    官方文档:
    Optimizer Statistics Concepts (oracle.com)

    1.1 表统计信息查看
    1. SELECT OWNER,
    2.        TABLE_NAME,
    3.        PARTITION_NAME,
    4.        OBJECT_TYPE,
    5.        NUM_ROWS,
    6.        BLOCKS,
    7.        EMPTY_BLOCKS,
    8.        AVG_SPACE,
    9.        CHAIN_CNT,
    10.        AVG_ROW_LEN,
    11.        to_char(LAST_ANALYZED, 'yyyy-mm-dd hh24:mi:ss') LAST_ANALYZED,
    12.        USER_STATS
    13.   FROM DBA_TAB_STATISTICS
    14. WHERE OWNER='CMXBUSI'
    15. AND TABLE_NAME = 'T02';
    复制代码
    1.2 索引统计信息查看
    1. SELECT INDEX_NAME              AS NAME,
    2.        BLEVEL,
    3.        LEAF_BLOCKS             AS LEAF_BLKS,
    4.        DISTINCT_KEYS           AS DST_KEYS,
    5.        NUM_ROWS,
    6.        CLUSTERING_FACTOR       AS CLUST_FACT,
    7.        AVG_LEAF_BLOCKS_PER_KEY AS LEAF_PER_KEY,
    8.        AVG_DATA_BLOCKS_PER_KEY AS DATA_PER_KEY,
    9.        LAST_ANALYZED
    10.   FROM DBA_IND_STATISTICS where
    11.   TABLE_OWNER='CMXBUSI' AND
    12.   TABLE_NAME='T02';

    13. select table_name,index_name,leaf_blocks,blevel,distinct_keys,avg_leaf_blocks_per_key,avg_data_blocks_per_key,clustering_factor,num_rows from dba_indexes where owner = 'SCOTT' and table_name = 'T1';
    复制代码
    1.3 列统计信息查看
    1. 方法一:
    2. SELECT COLUMN_NAME,
    3.       NUM_DISTINCT,
    4.       LOW_VALUE,
    5.       HIGH_VALUE,
    6.       DENSITY ,
    7.       NUM_NULLS ,
    8.       AVG_COL_LEN ,
    9.       HISTOGRAM,
    10.       NUM_BUCKETS
    11.   FROM DBA_TAB_COL_STATISTICS
    12. WHERE OWNER='CMXBUSI'
    13. AND TABLE_NAME = 'T02';


    14. 方法二:
    15. a.owner ||'.'||a.table_name name ,
    16. a.column_name,
    17. b.num_rows,
    18. a.num_distinct Cardinality,
    19. a.num_distinct/b.num_rows selectivity,
    20. num_nulls,density,
    21. a.histogram,
    22. a.num_buckets
    23. from dba_tab_col_statistics a,dba_tables b
    24. where a.owner=b.owner
    25. and a.table_name=b.table_name
    26. and a.owner=upper('CMXBUSI')
    27. and a.table_name=upper('T02')
    28. and a.column_name=upper('ID');

    29. 方法三:
    30. select table_name,column_name,num_distinct,low_value,high_value,histogram,density from dba_tab_columns where owner = 'SCOTT' and table_name = 'T1';
    复制代码
    二、DBMS_STATS收集统计信息

    dbms_stas 包不仅能够对表进行分析,它还可以对数据库分析进行管理。 按照功能可以分一下几类:
    (1) 性能数据的收集
    (2) 性能数据的设置
    (3) 性能数据的删除
    (4) 性能数据的备份和恢复
    1. 1.性能数据的收集
    2. 这个包的下面四个存储过程分别收集 index、table、schema、database 的统计信息:
    3. dbms_stats.gather_table_stats 收集表、列和索引的统计信息(当 cascade 为true 时,分析表、列(索引)信息);
    4. dbms_stats.gather_schema_stats 收集 schema 下所有对象的统计信息;
    5. dbms_stats.gather_index_stats 收集索引的统计信息;
    6. dbms_stats.gather_system_stats 收集系统统计信息
    7. dbms_stats.gather_dictionary_stats: 所有字典对象的统计;
    8. dbms_stats.GATHER_DATABASE_STATS:分析数据库信息
    9. dbms_stats.create_stat_table 创建存放统计信息表
    10. dbms_stats.auto_sample_size 采样值

    11. 2.性能数据的设置
    12. 设置表统计信息:dbms_stats.set_table_stats
    13. 设置索引统计信息:dbms_stats.set_index_stats
    14. 设置列统计信息:dbms_stats.set_column_stats

    15. 3.性能数据的删除
    16. 删除数据库统计信息:dbms_stats.delete_database_stats
    17. 删除用户方案统计信息:dbms_stats.delete_schema_stats
    18. 删除表统计信息:dbms_stats.delete_table_stats
    19. 删除索引统计信息:dbms_stats.delete_index_stats
    20. 删除列统计信息:dbms_stats.delete_column_stats

    21. 4.性能数据的备份和恢复
    22. dbms_stats.EXPORT_COLUMN_STATS:导出列的分析信息
    23. dbms_stats.EXPORT_INDEX_STATS:导出索引分析信息
    24. dbms_stats.EXPORT_SYSTEM_STATS:导出系统分析信息
    25. dbms_stats.EXPORT_TABLE_STATS:导出表分析信息
    26. dbms_stats.EXPORT_SCHEMA_STATS:导出方案分析信息
    27. dbms_stats.EXPORT_DATABASE_STATS:导出数据库分析信息
    28. dbms_stats.IMPORT_COLUMN_STATS:导入列分析信息
    29. dbms_stats.IMPORT_INDEX_STATS:导入索引分析信息
    30. dbms_stats.IMPORT_SYSTEM_STATS:导入系统分析信息
    31. dbms_stats.IMPORT_TABLE_STATS:导入表分析信息
    32. dbms_stats.IMPORT_SCHEMA_STATS:导入方案分析信息
    33. dbms_stats.IMPORT_DATABASE_STATS:导入数据库分析信息
    复制代码
    2.1 收集统计信息步骤
    1. 1.检查统计信息
    2. set linesize 300;
    3. SELECT OWNER,TABLE_NAME,NUM_ROWS,LAST_ANALYZED  FROM dba_tables where  TABLE_NAME  in (
    4. 'T_S_TYPE',
    5. 'T_EDF_TASK'
    6. );

    7. 2.针对运行效率慢的SQL情况,按表收集统计信息:
    8. sqlplus / as sysdba <<EOF
    9. exec DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => '用户名',TABNAME => '表名' ,ESTIMATE_PERCENT => 0.1 ,METHOD_OPT => 'FOR ALL INDEXED COLUMNS' ,CASCADE => TRUE,DEGREE => 30);
    10. EOF

    11. ps:ESTIMATE_PERCENT => 0.1    为采样比例

    12. 3.针对运行效率慢的SQL情况,按用户收集统计信息:
    13. sqlplus / as sysdba <<EOF
    14. exec DBMS_STATS.GATHER_schema_STATS(OWNNAME => 'CCICJY' ,ESTIMATE_PERCENT => 0.1 ,METHOD_OPT => 'FOR ALL INDEXED COLUMNS' ,CASCADE => TRUE,DEGREE => 30);
    15. EOF

    16. 4.查看统计信息是否执行
    17. select  * from dba_scheduler_jobs;
    18. select * from dba_scheduler_jobs  WHERE JOB_NAME='GATHER_STATS_JOB';
    复制代码
    2.2 DBMS_STATS.GATHER_TABLE_STATS使用详解
    1. DBMS_STATS.GATHER_TABLE_STATS的语法如下:

    2. DBMS_STATS.GATHER_TABLE_STATS (ownname VARCHAR2, tabname VARCHAR2, partname  VARCHAR2, estimate_percent NUMBER, block_sample BOOLEAN, method_opt VARCHAR2, degree NUMBER, granularity VARCHAR2, cascade BOOLEAN, stattab VARCHAR2, statid VARCHAR2, statown VARCHAR2, no_invalidate BOOLEAN, force BOOLEAN);

    3. 参数说明:

    4. 1.ownname:要分析表的拥有者

    5. 2.tabname:要分析的表名.

    6. 3.partname:分区的名字,只对分区表或分区索引有用.

    7. 4.estimate_percent:采样行的百分比,取值范围[0.000001,100],null为全部分析,不采样.
    8.   常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默认值,由oracle决定最佳取采样值.

    9. 5.block_sapmple:是否用块采样代替行采样.

    10. 6.method_opt:决定histograms信息是怎样被统计的(抽样方法)
    11. method_opt的取值如下(默认值为FOR ALL COLUMNS SIZE AUTO):
    12.   for table:只统计表
    13.   for all columns:分析所有的列
    14.   for all indexes:只分析统计相关索引
    15.   for all indexed columns:只统计有索引的表列
    16.   for all hidden columns:分析所有隐藏列(函数索引等
    17.   for columns <list> SIZE <N> | REPEAT | AUTO | SKEWONLY:统计指定列的histograms.
    18.       N的取值范围[1,254];
    19.       REPEAT:上次统计过的histograms;
    20.       AUTO:由oracle决定N的大小;
    21.       skewonly:Oracle 确定需要收集检查每个索引中每列值的分布
    22.   例如:
    23.           method_opt=>'for all columns size skewonly'
    24.           method_opt=>'for all columns size repeat'
    25.           method_opt=>'for all columns size auto'
    26.    
    27. 7.degree:决定并行度.默认值为null.
    28.   分析索引速度加快,根据 cpu 数量来设置,一般在业务空闲的时候 degree 可设为 cpu 数量-1,繁忙的时候就再小点。

    29. 8.granularity:要收集的统计信息的粒度(仅在表已分区时才相关)
    30.   根据将优化的 SQL语句,优化器可以选择使用分区统计或全局统计,对于大多数系统这两种统计都是很
    31. 重要的,Oracle 推荐将 GRANULARITY 设置为 AUTO 同时收集全部信息。  
    32.                         ①'AUTO'-根据分区类型确定粒度。这是默认值。
    33.                         ②'ALL' -收集所有(子分区,分区和全局)统计信息
    34.                         ③'GLOBAL' -收集全球统计数据
    35.                         ④'GLOBAL AND PARTITION'-收集全局和分区级别的统计信息。即使它是一个复合分区对象,也不会收集任何子分区级别统计信息。
    36.                         ⑤'PARTITION '-收集分区级别的统计信息
    37.                         ⑥'SUBPARTITION' -收集子分区级别的统计信息
    38.                         ⑦'DEFAULT'-收集全局和分区级别的统计信息。该选项已过时,并且当前受支持,但仅出于遗留原因才包含在文档中。您应该使用“ GLOBAL AND PARTITION”来实现此功能。请注意,默认值现在是'AUTAUTO'。

    39. 9.cascade:是收集索引的信息.默认为FALSE.

    40. 10.stattab:用户统计信息表标识符,用于描述将当前统计信息保存在何处
    41.   statid如果多个表的统计信息存储在同一个stattab中用于进行区分,标识符
    42.   statown存储统计信息表的拥有者.包含的架构stattab(如果不同于ownname)
    43. 以上三个参数若不指定,统计信息会直接更新到数据字典.

    44. 11.no_invalidate: 通过不同的参数配置,可以实现对 Oracle 失效共享游标行为的控制TRUE,FALSE
    45.   如果取值为 true,表示不进行游标失效动作,原有的 shared cursor 保持原有状态。
    46.   如果取值为 false,表示将统计量对象相关的所有 cursor 全部失效。
    47.   如果设置为auto_invalidate,根据官方文档,Oracle 自己决定 shared cursor 失效动作。
    48.   从 10G 开始,Oracle 就将 auto_invalidate 作为默认的统计量收集行为。
    49.   select dbms_stats.get_param(pname => 'no_invalidate') from dual;

    50. 12.force:即使表锁住了也收集统计信息.

    51. 13.options 分析模式
    52. 使用 4 个预设的法子之一,这个选项能把握 Oracle 统计的刷新方法:
    53.   gather——重新分析整个(Schema)。
    54.   gather empty——只分析目前还没有统计的表。
    55.   gather stale——只重新分析修改量超过 10%的表(这些修改包含插入、更新和删除)。
    56.   gather auto——重新分析以前没有统计的对象,以及统计数据过期(变脏)的对象。
    57. 注意,使用 gather auto 相似于组合使用 gather stale 和 gather empty。注意,不论 gather stale 仍是 gather auto,都请求进行监视。假如你施行一个alter table xxx monitoring 命令,Oracle 会用 dba_tab_modifications 视图来跟踪发生变动的表。这样一来,你就确实地知道,自从上一次剖析统计数据以来,发生了多少次插入、更新和删除操作。

    58. 14.objlist: 指定对象列表
    59. 15.obj_filter_list:A list of object filters
    60. 16.gather_sys:只收集 sys 的对象。
    61. 17.stattype:统计信息类型。允许的唯一值是DATA。
    复制代码
    2.3 收集直方图
    1. 直方图收集方法
    2. 1. 语法格式
    3.   对于dbms_stats包,是通过指定method_opt参数实现的,该参数可接受值如下:
    4. 1.1统计所有列的histograms(直方图).
    5. for all [indexed | hidden] columns [size_clause]

    6. 1.2统计指定列的histograms(直方图).
    7. for columns [size_clause] column | attribute [size_clause] [,column | attribute [size_clause]...]
    8.   例如:
    9.     for columns column  size 1
    10.     for columns column  size auto
    11.   其中size_clause必须符合以下格式:size [整数值 | repeat | auto | skewonly]

    12.       整数值:直方图的Bucket数,范围为[1,254],为1表示删除列上直方图信息
    13.       repeat:只对已有直方图的列收集直方图信息
    14.       auto:由oracle决定是否对列收集直方图,以及使用哪类直方图。oracle默认只对用过的列(where条件中出现过的列)自动收集直方图统计信息,oracle会在sys.col_usage$基表中记录各列的使用情况。在自动收集直方图统计信息时先查该表,如果列未被使用过,则不会收集。
    15.       skewonly:只对倾斜列收集直方图

    16. 2.距离
    17. 2.1 对表所有列以auto方式收集直方图
    18. exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',method_opt=> 'for all columns size auto');

    19. 2.2 对表所有有索引的列以auto方式收集直方图
    20. exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',method_opt=> 'for all indexed columns size auto');

    21. 2.3 对表的empno和deptno列以auto方式收集直方图
    22. exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',method_opt=> 'for columns size auto empno deptno');

    23. 2.4 对表的empno和deptno列收集直方图,并指定Bucket数为10
    24. exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',method_opt=> 'for columns size 10 empno deptno');

    25. 2.5 对表的empno和deptno列收集直方图,指定empno列Bucket数为10,deptno列Bucket数为5
    26. exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',method_opt=> 'for columns empno size 10 deptno size 5')

    27. 3.查询直方图
    28. SELECT COLUMN_NAME,NOTES,HISTOGRAM FROM DBA_TAB_COL_STATISTICS WHERE TABLE_NAME = 'SALES2';

    29. select * from user_histograms;
    复制代码
    2.4 收集数据库统计信息

    gather_database_stats 收集数据库级别的统计信息
    GATHER_DATABASE_STATS 语法与参数
    1. DBMS_STATS.GATHER_DATABASE_STATS (
    2.   estimate_percent NUMBER DEFAULT to_estimate_percent_type(get_param('ESTIMATE_PERCENT')),
    3.   block_sample BOOLEAN DEFAULT FALSE,
    4.   method_opt VARCHAR2 DEFAULT get_param('METHOD_OPT'),
    5.   degree NUMBER DEFAULTto_degree_type(get_param('DEGREE')),
    6.   granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
    7.   cascade BOOLEAN DEFAULT
    8.   to_cascade_type(get_param('CASCADE')),
    9.   stattab VARCHAR2 DEFAULT NULL,
    10.   statid VARCHAR2 DEFAULT NULL,
    11.   options VARCHAR2 DEFAULT 'GATHER',
    12.   objlist OUT ObjectTab,
    13.   statown VARCHAR2 DEFAULT NULL,
    14.   gather_sys BOOLEAN DEFAULT TRUE,
    15.   no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
    16.     get_param('NO_INVALIDATE')),
    17.   obj_filter_list ObjectTab DEFAULT NULL);
    复制代码
    gather_database_stats 测试:
    1. SQL>exec DBMS_STATS.gather_database_stats;
    2. SQL>exec DBMS_STATS.gather_database_stats(estimate_percent => 15);
    3. SQL>exec DBMS_STATS.GATHER_DATABASE_STATS(estimate_percent=>10,Degree=>8, Cascade=>TRUE, Granularity=>'ALL');
    复制代码
    过程:
    1. SQL> exec DBMS_STATS.gather_database_stats;
    2. PL/SQL procedure successfully completed
    复制代码
    查看进程
    1. SQL> select distinct sid, serial# from v$session_longops where opname like'%Gather%';
    2.        SID    SERIAL#
    3. ---------- ----------
    4.        459      20726

    5.        select distinct sid, serial# from v$session_longops where opname like'%gather_database_stats%';
    复制代码
    如果要终止:
    1. SQL> alter system kill session '459,20726';
    2. System altered
    复制代码
    2.5 收集用户统计信息

    1)、GATHER_SCHEMA_STATS 语法与参数
    1. DBMS_STATS.GATHER_SCHEMA_STATS (
    2.   ownname VARCHAR2,
    3.   estimate_percent NUMBER DEFAULT to_estimate_percent_type(get_param('ESTIMATE_PERCENT')),
    4.   block_sample BOOLEAN DEFAULT FALSE,
    5.   method_opt VARCHAR2 DEFAULT get_param('METHOD_OPT'),
    6.   degree NUMBER DEFAULTto_degree_type(get_param('DEGREE')),
    7.   granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
    8.   cascade BOOLEAN DEFAULTto_cascade_type(get_param('CASCADE')),
    9.   stattab VARCHAR2 DEFAULT NULL,
    10.   statid VARCHAR2 DEFAULT NULL,
    11.   options VARCHAR2 DEFAULT 'GATHER',
    12.   objlist OUT ObjectTab,
    13.   statown VARCHAR2 DEFAULT NULL,
    14.   no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
    15.     get_param('NO_INVALIDATE')),
    16.   force BOOLEAN DEFAULT FALSE,
    17.   obj_filter_list ObjectTab DEFAULT NULL);       
    18. GATHER_SCHEMA_STATS
    复制代码
    2.5.2 重新收集用户所有的统计信息
    1. begin
    2. dbms_stats.gather_schema_stats(ownname => 'CMXBUSI',
    3.                                 options => 'gather',
    4.                                 estimate_percent => 100,
    5.                                 method_opt => 'for all indexed columns',
    6.                                 degree => 2);
    7. end;
    8. /
    复制代码
    2.5.3 重新收集用户以前没有统计的对象
    1. begin
    2. dbms_stats.gather_schema_stats(ownname => 'CMXBUSI',
    3.                                 options => 'gather auto',
    4.                                 estimate_percent =>dbms_stats.AUTO_SAMPLE_SIZE,
    5.                                 method_opt => 'for all columns size auto',
    6.                                 cascade => true,
    7.                                 degree => 2);
    8. end;
    9. /
    复制代码
    2.5.4 收集用户分区表和索引信息
    1. begin
    2. dbms_stats.gather_schema_stats(ownname => 'CMXBUSI',
    3.                                 estimate_percent => 10,
    4.                                 cascade => true,
    5.                                 granularity => 'all',
    6.                                 degree => 2);
    7. end;
    8. /
    复制代码
    2.6 收集表的统计信息

    收集统计信息的方法之 gather_table_stats
    1)统计信息的函数 dbms_stats.gather_table_stats 介绍:
    1. dbms_stats.gather_table_stats (
    2.   ownname varchar2,
    3.   tabname varchar2,
    4.   partname varchar2 default null,
    5.   estimate_percent number default to_estimate_percent_type
    6.   (get_param('estimate_percent')),
    7.   block_sample boolean default false,
    8.   method_opt varchar2 default get_param('method_opt'),
    9.   degree number default to_degree_type(get_param('degree')),
    10.   granularity varchar2 default get_param('granularity'),
    11.   cascade boolean defaultto_cascade_type(get_param('cascade')),
    12.   stattab varchar2 default null,
    13.   statid varchar2 default null,
    14.   statown varchar2 default null,
    15.   no_invalidate boolean default to_no_invalidate_type (
    16.     get_param('no_invalidate')),
    17.   force boolean default false);
    复制代码
    2)gather_table_stats 测试:
    –查看表的统计信息
    1. SQL>select table_name, blocks, empty_blocks, num_rows from SQL>dba_tables where owner = 'SCOTT' and table_name = 'T1';
    2. SQL>select table_name, blocks, empty_blocks, num_rows,LAST_ANALYZED fromdba_tables where owner = 'SCOTT' and table_name = 'T1';
    3. SQL>select table_name,sample_size,num_rows,round(sample_size/num_rows*100,1)"%" from dba_tables where owner = 'SCOTT' and table_name = 'T1';
    4. SQL>select table_name,sample_size,num_rows,round(sample_size/num_rows*100,1)"%" from dba_tables where owner = 'SCOTT' order by table_name;
    复制代码
    –查看表列的统计信息
    1. SQL>select table_name,column_name,last_analyzed,num_distinct,low_value,high_value,histogram,density from dba_tab_columns where owner = 'SCOTT' and table_name ='T1';
    复制代码
    –查看表索引的统计信息
    1. SQL>select table_name,index_name,last_analyzed,leaf_blocks,blevel,distinct_keys,avg_leaf_blocks_per_key,avg_data_blocks_per_key,clustering_factor,num_rows fromdba_indexes where owner = 'SCOTT' and table_name = 'T1';
    复制代码
    –情形1:收集表,包括表的所有列和索引的统计信息
    1. SQL>analyze table ITPUX_M10 delete statistics;
    2. SQL>begin
    3. >dbms_stats.gather_table_stats(ownname => 'SCOTT',
    4.                                >tabname => 'T1',
    5.                                >estimate_percent =>dbms_stats.AUTO_SAMPLE_SIZE,
    6.                                >method_opt => 'for all indexed columns',
    7.                                >cascade => true,
    8.                                >degree => 2);
    9. >end;
    10. >/
    复制代码
    –情形2:只收集表的统计信息,采样比例为 15%
    1. SQL>analyze table ITPUX_M10 delete statistics;
    2. SQL>begin
    3. >dbms_stats.gather_table_stats(ownname => 'SCOTT',
    4.                                >tabname => 'T1',
    5.                                >estimate_percent => 15,
    6.                                >method_opt => 'for table',
    7.                                >cascade => false,
    8.                                >degree => 2);
    9. >end;
    10. >/
    复制代码
    –情形3:只收集表的统计信息,其中两列的信息不收集直方图
    1. SQL>analyze table T1 delete statistics;
    2. SQL>begin
    3. >dbms_stats.gather_table_stats(ownname => 'SCOTT',
    4.                                >tabname => 'T1',
    5.                                >estimate_percent => 100,
    6.                                >method_opt => 'for columns size 1 object_name status',
    7.                                >cascade => false,
    8.                                >degree => 2);
    9. >end;
    10. >/
    复制代码
    –情形4:只收集表的信息,表所有列以及表所有索引的统计信息
    1. SQL>begin
    2. >dbms_stats.gather_table_stats(ownname => 'SCOTT',
    3.                                >tabname => 'T1',
    4.                                >estimate_percent => 100,
    5.                                >cascade => true,
    6.                                >degree => 2);
    7. >end;
    8. >/
    复制代码
    –情形5包括表,分区表,子分区)
    1. SQL>begin
    2. >dbms_stats.gather_table_stats(ownname => 'SCOTT',
    3.                                >tabname => 'T1',
    4.                                >estimate_percent => 18,
    5.                                >cascade => true,
    6.                                >granularity => 'ALL',    --全局的表,分区表,子分区表
    7.                                >degree => 2);
    8. >end;
    9. >/
    复制代码
    –情形6:分区级的统计信息收集
    1. SQL>begin
    2. >dbms_stats.gather_table_stats(ownname => 'SCOTT',
    3.                                >tabname => 'T1',
    4.                                >partname => '分区名',
    5.                                >estimate_percent => 5,
    6.                                >cascade => true,
    7.                                >granularity => 'PARTITION',
    8.                                >method_opt => 'for all indexes columns',
    9.                                >degree => 2);
    10. >end;
    11. >/
    复制代码
    –情形7:删除表的统计信息
    1. SQL>begin
    2. >dbms_stats.delete_table_stats (ownname => 'SCOTT',tabname >=>'T1');
    3. >end;
    4. >/
    复制代码
    2.7 收集index 的统计信息

    1)gather_index_stats 语法
    1. DBMS_STATS.GATHER_INDEX_STATS (
    2.   ownname VARCHAR2,
    3.   indname VARCHAR2,
    4.   partname VARCHAR2 DEFAULT NULL,
    5.   estimate_percent NUMBER DEFAULT to_estimate_percent_type (GET_PARAM('ESTIMATE_PERCENT')),
    6.   stattab VARCHAR2 DEFAULT NULL,
    7.   statid VARCHAR2 DEFAULT NULL,
    8.   statown VARCHAR2 DEFAULT NULL,
    9.   degree NUMBER DEFAULT to_degree_type(get_param('DEGREE')),
    10.   granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
    11.   no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (GET_PARAM('NO_INVALIDATE')),
    12.   force BOOLEAN DEFAULT FALSE);
    复制代码
    2.8 数据字典表收集
    1. GATHER_DICTIONARY_STATS:
    2. DBMS_STATS.GATHER_DICTIONARY_STATS (
    3.   comp_id VARCHAR2 DEFAULT NULL,
    4.   estimate_percent NUMBER DEFAULT to_estimate_percent_type (get_param('ESTIMATE_PERCENT')),
    5.   block_sample BOOLEAN DEFAULT FALSE,
    6.   method_opt VARCHAR2 DEFAULT get_param('METHOD_OPT'),
    7.   degree NUMBER DEFAULT to_degree_type(get_param('DEGREE')),
    8.   granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
    9.   cascade BOOLEAN DEFAULT to_cascade_type(get_param('CASCADE')),
    10.   stattab VARCHAR2 DEFAULT NULL,
    11.   statid VARCHAR2 DEFAULT NULL,
    12.   options VARCHAR2 DEFAULT 'GATHER AUTO',
    13.   objlist OUT ObjectTab,
    14.   statown VARCHAR2 DEFAULT NULL,
    15.   no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (get_param('NO_INVALIDATE')),
    16.   obj_filter_list ObjectTab DEFAULT NULL);
    复制代码
    1. SQL> exec DBMS_STATS.GATHER_DICTIONARY_STATS
    2. (estimate_percent=>100, Degree=>8, Cascade=>TRUE, Granularity=>'ALL');
    复制代码
    2.9 动态性能表收集
    1. 动态性能表统计信息采集GATHER_FIXED_OBJECTS_STATS
    2. DBMS_STATS.GATHER_FIXED_OBJECTS_STATS (
    3.   stattab VARCHAR2 DEFAULT NULL,
    4.   statid VARCHAR2 DEFAULT NULL,
    5.   statown VARCHAR2 DEFAULT NULL,
    6.   no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (get_param('NO_INVALIDATE')));
    复制代码
    1. SQL> exec DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
    复制代码
    测试:
    v$lock 视图访问慢解决方法
    V$ 视图访问慢–解决方法
    分析:可能是有数据字典统计信息过久,造成。
    1. SQL>exec dbms_stats.gather_fixed_objects_stats;
    复制代码
    2.10 收集所有数据字典的fixed table 的统计信息

    请勿在业务高峰期间执行。
    如果需要单独对这张fixed_table 进行统计分析也可以用:
    1. SQL>exec DBMS_STATS.GATHER_TABLE_STATS ('SYS', 'X$KSUSE');
    2. SQL>exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'RECYCLEBIN$');
    复制代码
    然后确认统计信息的正确性:
    1. SQL>select count(*) from sys.tab_stats$;
    2. SQL>select num_rows, last_analyzed from user_tab_statistics where table_name ='X$KSUSE';
    复制代码
    关于基表的查询:
    1. SQL>select VIEW_DEFINITION from v$fixed_view_definition where view_name='V$LOCK';
    2. or:
    3. SQL>select dbms_metadata.get_ddl('VIEW', 'DBA_EXTENTS') from dual;
    复制代码
    三、analyze收集统计信息

    三大功能
    ① 搜集和删除索引、表和簇的统计信息
    ② 验证表、索引和簇的结构
    ③ 鉴定表和簇和行迁移和行链接

    3.1 表情况查询

    查看表的统计信息
    1. select table_name, blocks, empty_blocks, num_rows
    2. from dba_tables
    3. where owner = 'CMXBUSI'
    4. and table_name = 'T02';
    复制代码
    查看表列的统计信息
    1. select table_name,
    2. column_name,
    3. num_distinct,
    4. low_value,
    5. high_value,
    6. histogram,
    7. density
    8. from dba_tab_columns
    9. where owner = 'CMXBUSI'
    10. and table_name = 'T02';
    复制代码
    查看表索引的统计信息
    1. select * from dba_indexes
    2. leaf_blocks,              -- 索引中叶子块数据
    3. blevel,                   -- B 树索引等级
    4. distinct_keys,            -- 不同索引值的数量
    5. avg_leaf_blocks_per_key,  -- 索引中的每个值平均在多少个叶子块中,如果是主键/唯一就是 1.
    6. avg_data_blocks_per_key,  -- 通过索引中的一个值指向表中的数据块,应数据块数量的平均值。
    7. clustering_factor,        -- 聚集因子,越小越好,越大越不好。num_rows --索引的行数量。

    8. SELECT  TABLE_NAME,INDEX_NAME,LEAF_BLOCKS,blevel,DISTINCT_KEYS,AVG_LEAF_BLOCKS_PER_KEY,AVG_DATA_BLOCKS_PER_KEY,CLUSTERING_FACTOR
    9. from dba_indexes
    10. WHERE TABLE_OWNER='CMXBUSI'
    11. and table_name = 'T02';
    复制代码
    3.2 表收集
    1. analyze table t1 compute statistics for table;
    复制代码
    3.3 表字段收集
    1. analyze table T1 compute statistics for all columns;
    复制代码
    3.4 索引字段收集
    1. analyze table T1 compute statistics for all indexed columns;
    复制代码
    3.5 同时收集表,表字段,索引字段
    1. analyze table T1 compute statistics;
    复制代码
    3.6 索引收集
    1. analyze table T1 compute statistics for all indexes;
    复制代码
    3.7 同时收集表,表字段,索引
    1. analyze table T1 compute statistics for table for all indexes for all columns;
    复制代码
    3.8 删统计信息
    1. analyze table t1 delete statistics;
    复制代码
    3.9 验证表,索引,分区的结构
    1. analyze table T1 validate structure;

    2. analyze table CMXBUSI.T01 validate structure;
    复制代码
    四、知识总结

    这是对命令与工具包的总结:
    1、对于分区表,建议使用DBMS_STAT,而不是使用analyze语句。
    a)可以并行进行,对多个用户,多个table
    b)可以得到整个分区表的数据和单个分区的数据。
    c)可以在不同级别上compute statics:单个分区、子分区、全表、所有分区。
    d)可以导出统计信息
    e)可以用户自动收集统计信息
    DBMS_STATS的缺点
    a)不能validate strtucture
    b)不能收集CHAINED ROWS,不能收集CLUSTER TABLE的信息,这两个仍旧需要使用analyze语句。
    c)DBMS_STATS默认不对索引进行analyze,因为默认cascade是false,需要手工指定为True。

    总结

    到此这篇关于Oracle数据库统计信息的文章就介绍到这了,更多相关Oracle统计信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/331742z7x.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表