zoukankan      html  css  js  c++  java
  • 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想要得要一个高效的执行计划需要如此多的统计信息

  • 相关阅读:
    Nancy 寄宿IIS
    原子操作
    CSRF跨站请求伪造
    CORS跨域
    C# 运算符
    Mysql 函数
    Mongodb for .Net Core 驱动的应用
    Mongodb for .Net Core 封装类库
    制作项目模板
    压缩图片
  • 原文地址:https://www.cnblogs.com/polestar/p/4435347.html
Copyright © 2011-2022 走看看