Oracle 分区表的统计信息实例

  ORACLE的统计信息在执行SQL的过程中扮演着非常重要的作用,而且ORACLE在表的各个层次都会有不同的统计信息,通过这些统计信息来描述表的,列的各种各样的统计信息。下面通过一个复合分区表来说明一些常见的和不常见的统计信息。

搭建测试用例

--创建表。
SQL>
create table test
partition by range(object_id)
subpartition by hash(object_type) subpartitions 4
(partition p1 values less than(10000),
partition p2 values less than(20000),
partition p3 values less than(30000),
partition p4 values less than(maxvalue))
as
select * from dba_objects;

--收集统计信息
sql>
BEGIN
dbms_stats.gather_table_stats(  ownname          => ‘NC60‘,
                                tabname          => ‘TEST‘,
                                estimate_percent => 100,                       --百分之百采样
                                block_sample     => FALSE,
                                method_opt       => ‘FOR ALL COLUMNS SIZE 10‘, --收集直方图
                                granularity      => ‘ALL‘,                     --所有分区
                                cascade          => TRUE                       --收集索引
                             );
END;

1,表级的统计信息

SQL> select table_name,num_rows,blocks,empty_blocks,avg_space
  2  from user_tables
  3  where table_name = ‘TEST‘;

TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE
------------------------------ ---------- ---------- ------------ ----------
TEST                                87556       1328            0          0

2,表上列的统计信息

SQL> select table_name,column_name,num_distinct,density
  2  from user_tab_columns
  3  where table_name = ‘TEST‘;

TABLE_NAME                     COLUMN_NAME                    NUM_DISTINCT    DENSITY
------------------------------ ------------------------------ ------------ ----------
TEST                           OWNER                                    34 .023504483
TEST                           OBJECT_NAME                           57495 .000020431
TEST                           SUBOBJECT_NAME                          163 .007094837
TEST                           OBJECT_ID                             87556 .000011421
TEST                           DATA_OBJECT_ID                        22685 .000044786
TEST                           OBJECT_TYPE                              45 .086650298
TEST                           CREATED                                2057 .000847961
TEST                           LAST_DDL_TIME                          1898 .000919514
TEST                           TIMESTAMP                              2182 .000838526
TEST                           STATUS                                    1 5.7106E-06
TEST                           TEMPORARY                                 2 5.7106E-06

TABLE_NAME                     COLUMN_NAME                    NUM_DISTINCT    DENSITY
------------------------------ ------------------------------ ------------ ----------
TEST                           GENERATED                                 2 5.7106E-06
TEST                           SECONDARY                                 2 5.7106E-06
TEST                           NAMESPACE                                21 .116972867
TEST                           EDITION_NAME                              0          0

3,表上列的直方图信息(OBJECT_ID列)

SQL> col TABLE_NAME format a20
SQL> col COLUMN_NAME format a40
SQL> select table_name,column_name,endpoint_number,endpoint_value
  2  from user_tab_histograms
  3  where table_name = ‘TEST‘
  4  and column_name = ‘OBJECT_ID‘;

TABLE_NAME           COLUMN_NAME                              ENDPOINT_NUMBER ENDPOINT_VALUE
-------------------- ---------------------------------------- --------------- --------------
TEST                 OBJECT_ID                                              0              2
TEST                 OBJECT_ID                                              1           8921
TEST                 OBJECT_ID                                              2          17998
TEST                 OBJECT_ID                                              3          26754
TEST                 OBJECT_ID                                              4          35510
TEST                 OBJECT_ID                                              5          44266
TEST                 OBJECT_ID                                              6          53025
TEST                 OBJECT_ID                                              7          62172
TEST                 OBJECT_ID                                              8          71290
TEST                 OBJECT_ID                                              9          82232
TEST                 OBJECT_ID                                             10          91577

4,分区的统计信息

SQL> select partition_name,num_rows,blocks,empty_blocks,avg_space
  2  from user_tab_partitions
  3  where table_name = ‘TEST‘;

PARTITION_NAME                   NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE
------------------------------ ---------- ---------- ------------ ----------
P1                                   9708        147            0          0
P2                                   9805        162            0          0
P3                                  10000        156            0          0
P4                                  58043        863            0          0

5,分区上列的统计信息

SQL> select column_name,num_distinct,density,num_nulls
  2  from user_part_col_statistics
  3  where table_name = ‘TEST‘
  4  and partition_name = ‘P1‘;

COLUMN_NAME                              NUM_DISTINCT    DENSITY  NUM_NULLS
---------------------------------------- ------------ ---------- ----------
OWNER                                               5 .000051504          0
OBJECT_NAME                                      7878 .000142267          0
SUBOBJECT_NAME                                     25  .00877193       9594
OBJECT_ID                                        9708 .000103008          0
DATA_OBJECT_ID                                   2074 .000560776       7597
OBJECT_TYPE                                        20 .080003882          0
CREATED                                           141 .011559584          0
LAST_DDL_TIME                                     213 .010730067          0
TIMESTAMP                                         182 .011371733          0
STATUS                                              1 .000051504          0
TEMPORARY                                           2 .000051504          0

COLUMN_NAME                              NUM_DISTINCT    DENSITY  NUM_NULLS
---------------------------------------- ------------ ---------- ----------
GENERATED                                           2 .000051504          0
SECONDARY                                           1 .000051504          0
NAMESPACE                                           8 .000051504          0
EDITION_NAME                                        0          0       9708

6,分区上列的直方图信息(OBJECT_ID列)

SQL> select column_name,bucket_number,endpoint_value
  2  from user_part_histograms
  3  where table_name = ‘TEST‘
  4  and partition_name = ‘P1‘
  5  and column_name = ‘OBJECT_ID‘;

COLUMN_NAME                              BUCKET_NUMBER ENDPOINT_VALUE
---------------------------------------- ------------- --------------
OBJECT_ID                                            0              2
OBJECT_ID                                            1           1030
OBJECT_ID                                            2           2010
OBJECT_ID                                            3           2981
OBJECT_ID                                            4           3952
OBJECT_ID                                            5           4923
OBJECT_ID                                            6           5928
OBJECT_ID                                            7           6953
OBJECT_ID                                            8           7933
OBJECT_ID                                            9           8903
OBJECT_ID                                           10           9999

11 rows selected.

7,子分区的统计信息

SQL> select subpartition_name,num_rows,blocks,empty_blocks
  2  from user_tab_subpartitions
  3  where table_name = ‘TEST‘
  4  and partition_name = ‘P1‘;

SUBPARTITION_NAME                NUM_ROWS     BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ---------- ------------
SYS_SUBP21                           3314         48            0
SYS_SUBP22                           3824         57            0
SYS_SUBP23                            528         11            0
SYS_SUBP24                           2042         31            0

SQL>

8,子分区上的列的统计信息

SQL> select column_name,num_distinct,density
  2  from user_subpart_col_statistics
  3  where table_name = ‘TEST‘
  4  and subpartition_name = ‘SYS_SUBP21‘;

COLUMN_NAME                              NUM_DISTINCT    DENSITY
---------------------------------------- ------------ ----------
OWNER                                               3 .000150875
OBJECT_NAME                                      3314  .00030175
SUBOBJECT_NAME                                      1 .009615385
OBJECT_ID                                        3314  .00030175
DATA_OBJECT_ID                                    178 .005617978
OBJECT_TYPE                                         7 .000150875
CREATED                                           126 .017527186
LAST_DDL_TIME                                     148  .01653325
TIMESTAMP                                         134 .017483116
STATUS                                              1 .000150875
TEMPORARY                                           2 .000150875

COLUMN_NAME                              NUM_DISTINCT    DENSITY
---------------------------------------- ------------ ----------
GENERATED                                           2 .000150875
SECONDARY                                           1 .000150875
NAMESPACE                                           5 .000150875
EDITION_NAME                                        0          0

9,子分区上的列的直方图信息

SQL> select column_name,bucket_number,endpoint_value
  2  from user_subpart_histograms
  3  where table_name = ‘TEST‘
  4  and subpartition_name = ‘SYS_SUBP21‘
  5  and column_name = ‘OBJECT_ID‘;

COLUMN_NAME                              BUCKET_NUMBER ENDPOINT_VALUE
---------------------------------------- ------------- --------------
OBJECT_ID                                            0            100
OBJECT_ID                                            1           1764
OBJECT_ID                                            2           2429
OBJECT_ID                                            3           3088
OBJECT_ID                                            4           3752
OBJECT_ID                                            5           4309
OBJECT_ID                                            6           4640
OBJECT_ID                                            7           5828
OBJECT_ID                                            8           7278
OBJECT_ID                                            9           8912
OBJECT_ID                                           10           9998

我们对这个复合分区分析之后产生了上面这九种不同层次的统计信息。CBO想要得要一个高效的执行计划需要如此多的统计信息

时间: 2024-09-28 15:52:14

Oracle 分区表的统计信息实例的相关文章

Oracle之自动收集统计信息

一.Oracle 11g 在Oracle的11g版本中提供了统计数据自动收集的功能.在部署安装11g Oracle软件过程中,其中有一个步骤便是提示是否启动这个功能(默认是启用这个功能). 在这里介绍一下怎么将该功能启用与禁用: 1.查看自动收集统计信息的任务及状态: SQL> select client_name,status from dba_autotask_client; CLIENT_NAME STATUS ---------------------------------------

启用oracle 11g自动收集统计信息

今天接到朋友数据库一个case,在DBCA建库时,把自动收集统计信息的选项去掉了,数据库运行半年没有收集过统计信息,现在要启用方法如下: exec DBMS_AUTO_TASK_ADMIN.ENABLE(); exec DBMS_AUTO_TASK_ADMIN.ENABLE(client_name => 'auto optimizer stats collection',operation =>'auto optimizer stats job',window_name=> null);

oracle 12c 关闭统计信息收集和启用统计信息收集

oracle 12c 关闭统计信息收集和启用统计信息收集 --关闭统计信息 col client_name for a60 select client_name,status from DBA_AUTOTASK_CLIENT; CLIENT_NAME STATUS ------------------------------------------------------------ ---------------- auto optimizer stats collection ENABLED

分区表的统计信息收集策略

#####1 如果每天产生一个分区, 1.10g库如果是一个日分区表,每天产生20到30万 笔数据,可以考虑采用分区复制的方式来缓解10g 晚上22点的统计信息造成的I/O 高峰期的 2.11g库可以采用"Incremental Statistic 的方式只收集增量数据. https://blogs.oracle.com/optimizer/maintaining-statistics-on-large-partitioned-tables Maintaining statistics on l

oracle表的统计信息完全正确,执行计划无故改变。原厂人员如是回复

就像在电话里提到的那样,Oracle内部的优化器是根据一系列的内部算法基于表上的统计信息来产生执行计划的.对于特别复杂的SQL语句,Oracle的优化器有一定几率不能得到最优的执行计划(因为机器代码实际上是比较死板的,虽然得到的执行计划按照内部的算法来看是比较快的,但是实际上这个执行计划可能在实际执行中比较慢).我们现在碰到的就是这种情况,虽然表的统计信息是准的,但恰恰优化器在基于这个统计信息使用内部算法得到的执行计划是不优化的一这是优化器的固有限制.这时候就需要DBA/Oracle Suppo

Oracle扩展的统计信息

我们在收集列的统计信息与直方图时,往往都是对某一列的收集.当谓词使用多个相关列时,会导致约束条件的冗余.这几个相关的列也被称作关联列.出现这种情况时,查询优化器也会做出不准确的判断.所以我们必须对这些相关列收集统计信息或直方图来描述这种依赖关系. 幸运的是,从Oracle11g开始,数据库可以收集基于表达式或者一组列上的对象统计信息和直方图,从而解决这种问题.这种新的统计叫做扩展的统计信息(extension statistics). 这种技术实际上是基于表达式或一组列创建一个隐藏列,叫做扩展(

[Oracle] 11G自动收集统计信息

在11g中,默认自动收集统计信息的时间为晚上10点(周一到周五,4个小时),早上6点(周六,周日,20个小时),如下所示: select a.window_name, a.repeat_interval,a.duration from dba_scheduler_windows a, dba_scheduler_wingroup_members b where a.window_name = b.window_name and b.window_group_name = 'MAINTENANCE

Oracle 锁定临时表统计信息

全局临时表的统计信息是不能被收集的,如果被收集,它的统计信息肯定为0,会造成执行计划不准,所以要锁定它的统计信息,禁止系统自动收集. --先解锁表的统计信息,然后删除表的统计信息,最后锁住表的统计信息 declare v_sql varchar2(500); cursor rowList1 is select'begin dbms_stats.unlock_table_stats(user,''' || table_name || '''); end;' from user_tables s w

收集oracle统计信息

优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分布:             --DBA_TAB_COLUMNS:NUM_DISTINCT,NUM_NULLS,HISTOGRAM:索引统计:--叶块数量,等级,聚簇因子:             --DBA_INDEXES:LEAF_BLOCKS,CLUSTERING_FACTOR,BLEVEL: