Oracle Histogram内部实现学习

Oracle Histogram内部实现学习

版本修订人修订日期备注
v0.1yangze.yz2016-10-29Oracle Histogram实现研究

我们可以通过Trace日志来查看Oracle收集统计信息的具体过程。
**注:
在Oracle 12c开始,在默认AUTO_SAMPLE_SIZE情况下,NDV等分析是通过FULL TABLE SCAN。
在12c之前,AUTO_SAMPLE_SIZE不会直接做full table scan分析NDV,而是使用采样方式。
设置采样比方式的内部实现,和12c之前版本的统计方式是相近的。**

Trace设置

Trace的设置是使用bit flag,各个bit对应的意义如下。

  1 (DSC_DBMS_OUTPUT_TRC); // output the trace log, not into trace file
  2 (DSC_SESSION_TRC); // trace in session only, will not modify the value of TRACE parameter
  4 (DSC_TAB_TRC);  // trace log when gathering table stats data
  8 (DSC_IND_TRC);  // trace log when gathering index stats data
  16 (DSC_COL_TRC);  // trace log when gathering column stats data
  32 (DSC_AUTOST_TRC); // save session state log into sys.stats_target$_log
  64 (DSC_SCALING_TRC); // trace the scaling log
  128 (DSC_ERROR_TRC);  // trace the errors/exceptions
  256 (DSC_DUBIOUS_TRC);  // trace the dubious stats data
  512 (DSC_AUTOJOB_TRC);  // trace the auto gathering job's event & error
  1024 (DSC_PX_TRC);  // trace the parallel log
  2048 (DSC_Q_TRC);  // dump the queries during gathering stats data
  4096 (DSC_CCT_TRC);  // trace the internal process of gathering MV stats data
  8192 (DSC_DIFFST_TRC);  // trace the differences of stats data before/after gathering

通过下面语句设置trace level。

 exec dbms_stats.set_param('TRACE', 2048+4+64+16+8+4096);

设置trace 日志文件名。默认trace文件名为 instancename_ora_ spid.trc

alter session set tracefile_identifier=stats_trace;   

在trace日志目录下查看trace日志

app/oracle/diag/rdbms/$instance/$instance/trace/

AUTO_SAMPLE_SIZE统计信息收集实例

frequency histogram与舍弃histogram

Param信息

DBMS_STATS: Start gather table stats -- tabname: T
DBMS_STATS:   job name:
DBMS_STATS:    |--> Operation id: 501
DBMS_STATS: gather_table_stats:
 <params><param name="block_sample" val="FALSE"/>
<param name="cascade" val="NULL"/>
<param name="concurrent" val="FALSE"/><param name="degree" val="NULL"/>
<param name="estimate_percent" val="DBMS_STATS.AUTO_SAMPLE_SIZE"/>
<param name="force" val="FALSE"/><param name="granularity" val="AUTO"/>
<param name="method_opt" val="FOR ALL COLUMNS SIZE AUTO"/>
<param name="no_invalidate" val="NULL"/>
<param name="ownname" val="SYS"/>
<param name="partname" val=""/>
<param name="reporting_mode" val="FALSE"/>
<param name="statid" val=""/>
<param name="statown" val=""/>
<param name="stattab" val=""/>
<param name="stattype" val="DATA"/>
<param name="tabname" val="T"/></params>

初步统计信息收集,表的ROW COUNT,COLUMNS的MIN、MAX、NOT NULL COUNT

SELECT
    /*+  full(t)    no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring xmlindex_sel_idx_tbl no_substrb_pad  */
    TO_CHAR (COUNT("C1")),
    SUBSTRB (
        DUMP (MIN("C1"), 16, 0, 64),
        1,
        240
    ),
    SUBSTRB (
        DUMP (MAX("C1"), 16, 0, 64),
        1,
        240
    ),
    TO_CHAR (COUNT("C2")),
    SUBSTRB (
        DUMP (MIN("C2"), 16, 0, 64),
        1,
        240
    ),
    SUBSTRB (
        DUMP (MAX("C2"), 16, 0, 64),
        1,
        240
    ),
    COUNT (ROWIDTOCHAR(ROWID))
FROM
    "SYS"."T"  /* TOPN,NIL,NIL,TOPN,NIL,NIL,RWID,U254,U254U*/

分析TOP N VALUES for COLUMNS

DBMS_STATS: start processing top n values for column "C1"
DBMS_STATS:   >> frequency histograms is not feasible
                       (topn_values is null), skip!
/*C1 通过top n values分析,frequency Histogram不适合*/
DBMS_STATS: start processing top n values for column "C2"
DBMS_STATS: Parsing topn values..
DBMS_STATS:    Extracted 10 rowid-freq pairs.
/*C2有10个top n values*/

获取frequency histogram的top n values

 SELECT
    /*+  no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring xmlindex_sel_idx_tbl no_substrb_pad  */
    SUBSTRB (DUMP("C2", 16, 0, 64), 1, 240) val,
    ROWIDTOCHAR (ROWID) rwid
FROM
    "SYS"."T" T
WHERE
    ROWID IN (
        CHARTOROWID ('AAAWduAABAAAYD5AAA'),
        CHARTOROWID ('AAAWduAABAAAYD5AAB'),
        CHARTOROWID ('AAAWduAABAAAYD5AAC'),
        CHARTOROWID ('AAAWduAABAAAYD5AAD'),
        CHARTOROWID ('AAAWduAABAAAYD5AAE'),
        CHARTOROWID ('AAAWduAABAAAYD5AAF'),
        CHARTOROWID ('AAAWduAABAAAYD5AAG'),
        CHARTOROWID ('AAAWduAABAAAYD5AAH'),
        CHARTOROWID ('AAAWduAABAAAYD5AAI'),
        CHARTOROWID ('AAAWduAABAAAYD5AAJ')
    )
ORDER BY
    "C2"

frequency histogram的列分析

DBMS_STATS: removal_count: -244 total_nonnull_rows: 9999 mnb:  254
DBMS_STATS: hist_type in exec_get_topn: 1024 ndv:10 mnb:254
DBMS_STATS: Evaluating frequency histogram for col: "C2"
DBMS_STATS:  number of values = 10, max # of buckects = 254, pct = 100, ssize = 9999
DBMS_STATS:   csr.hreq: 0  Histogram gathering flags: 1035
DBMS_STATS: done_hist in process_topn: TRUE  csr.ccnt: 1
DBMS_STATS: Mark column "C2" as top N computed
DBMS_STATS:  no histogram: setting density to 1/ndv (.0001000100010001000100010001000100010001)
DBMS_STATS: Skip topn computed column "C2" numhist: 1
DBMS_STATS: Iteration: 1 numhist: 1
DBMS_STATS: Iteration 1, percentage 100 nblks: 20

不适合frequency histogram的列分析

首先尝试hybrid histogram。但是由于c1列NDV 9999,表记录数9999,因此放弃的直方图。

DBMS_STATS: Building Histogram for C1
DBMS_STATS:  bktnum=-1, nnv=9999, snnv=9999, sndv=9999, est_ndv=9999, mnb=254
DBMS_STATS:  Trying hybrid histogram
DBMS_STATS: Starting query at 23-AUG-16 08.43.47.125081000 PM +08:00
SELECT
    SUBSTRB (DUMP(val, 16, 0, 64), 1, 240) ep,
    freq,
    cdn,
    ndv,
    (SUM(pop) OVER()) popcnt,
    (SUM(pop * freq) OVER()) popfreq,
    SUBSTRB (
        DUMP (MAX(val) OVER(), 16, 0, 64),
        1,
        240
    ) maxval,
    SUBSTRB (
        DUMP (MIN(val) OVER(), 16, 0, 64),
        1,
        240
    ) minval
FROM
    (
        SELECT
            val,
            freq,
            (SUM(freq) OVER()) cdn,
            (COUNT(*) OVER()) ndv,
            (
                CASE
                WHEN freq > ((SUM(freq) OVER()) / 254) THEN
                    1
                ELSE
                    0
                END
            ) pop
        FROM
            (
                SELECT
                    /*+  no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring xmlindex_sel_idx_tbl no_substrb_pad  */
                    "C1" val,
                    COUNT ("C1") freq
                FROM
                    "SYS"."T" T
                WHERE
                    "C1" IS NOT NULL
                GROUP BY
                    "C1"
            )
    )
ORDER BY
    val

DBMS_STATS:  > cdn 9999, popFreq 0, popCnt 0,
bktSize 39.51778656126482213438735177865612648221, bktSzFrc .51778656126482213438735177865612648221
  DBMS_STATS:  Evaluating hybrid histogram:  cht.count 254, mnb 254, ssize 9999, min_ssize 2500,
 appr_ndv  TRUE, ndv 9999, selNdv 0, selFreq 0, pct 100, avg_bktsize 39, csr.hreq FALSE, normalize TRUE

 DBMS_STATS:   Histogram gathering flags: 11
 DBMS_STATS:  Discarding histogram

最终的表统计信息

最终我们得到COLUMNS的统计信息如下:

====================================================================================================
DBMS_STATS: Statistics from clist:
DBMS_STATS: ====================================================================================================
DBMS_STATS: Number of rows in the table = 9999
DBMS_STATS: COL_NAME                       ACL       NV        SNNVDV    NDV       SNDV      DENS      CCNT     
DBMS_STATS: ----------------------------------------------------------------------------------------------------
DBMS_STATS: C1                             3.98E+00 0         9999      9999      9999      NULL      0        
DBMS_STATS:          min: Typ=2 Len=2: c1,2                                                                     
DBMS_STATS:          max: Typ=2 Len=3: c2,64,64                                                                 
DBMS_STATS: ----------------------------------------------------------------------------------------------------
DBMS_STATS: COL_NAME                       ACL       NV        SNNVDV    NDV       SNDV      DENS      CCNT     
DBMS_STATS: ----------------------------------------------------------------------------------------------------
DBMS_STATS: C2                             2.9E+00 0         9999      10        10        .00005000 1        
DBMS_STATS:          min: Typ=2 Len=1: 80                                                                       
DBMS_STATS:          max: Typ=2 Len=2: c1,a                                                                     
DBMS_STATS:          Histograms:
DBMS_STATS:          ---------------------------------------------------------------------------------------------------
DBMS_STATS:          BVAL   RPCNT    EAVAL                                                            ENVAL    EDVAL                                                
DBMS_STATS:          ---------------------------------------------------------------------------------------------------
DBMS_STATS:          999             80                                                               0        Typ=2 Len=1: 80                                      
DBMS_STATS:          1999            C102                                                             1        Typ=2 Len=2: c1,2                                    
DBMS_STATS:          2999            C103                                                             2        Typ=2 Len=2: c1,3                                    
DBMS_STATS:          3999            C104                                                             3        Typ=2 Len=2: c1,4                                    
DBMS_STATS:          4999            C105                                                             4        Typ=2 Len=2: c1,5                                    
DBMS_STATS:          5999            C106                                                             5        Typ=2 Len=2: c1,6                                    
DBMS_STATS:          6999            C107                                                             6        Typ=2 Len=2: c1,7                                    
DBMS_STATS:          7999            C108                                                             7        Typ=2 Len=2: c1,8                                    
DBMS_STATS:          8999            C109                                                             8        Typ=2 Len=2: c1,9                                    
DBMS_STATS:          9999            C10A                                                             9        Typ=2 Len=2: c1,a                                    
DBMS_STATS:          Need Actual Values (DSC_EAVS)
DBMS_STATS:          Histogram Type: FREQUENCY Data Type: 2
DBMS_STATS:          Histogram Flags: 4100 Histogram Gathering Flags: 1290
DBMS_STATS:          Incremental: FALSE Fix Control 13583722: 1
DBMS_STATS: ----------------------------------------------------------------------------------------------------
DBMS_STATS: arlen = 7 ssize = 9999
DBMS_STATS: prepare reporting structures...
DBMS_STATS: End of construct analyze using sql.

TOP-FREQUENCY Histogram

分析top n values

DBMS_STATS: start processing top n values for column "C1"
DBMS_STATS: Parsing topn values..
DBMS_STATS:    Extracted 200 rowid-freq pairs.
DBMS_STATS: topn sql (len: 7106):
/*200个top n values*/
SELECT
    /*+  no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring xmlindex_sel_idx_tbl no_substrb_pad  */
    SUBSTRB (DUMP("C1", 16, 0, 64), 1, 240) val,
    ROWIDTOCHAR (ROWID) rwid
FROM
    "SYS"."T" T
WHERE
    ROWID IN (
        CHARTOROWID ('AAAWduAABAAAYD5AAA'),
        CHARTOROWID ('AAAWduAABAAAYD6AF9'),
        CHARTOROWID ('AAAWduAABAAAYD8ACh'),
        CHARTOROWID ('AAAWduAABAAAYaYAJh'),
    .....
        CHARTOROWID ('AAAWduAABAAAYaZADg'),
        CHARTOROWID ('AAAWduAABAAAYaZADh'),
        CHARTOROWID ('AAAWduAABAAAYbVAKI')
    )
ORDER BY
    "C1"

结果分析

DBMS_STATS: remove last bucket: Typ=2 Len=3: c2,64,5f add: Typ=2 Len=3: c2,64,64
DBMS_STATS: removal_count: 1 total_nonnull_rows: 119995 mnb:  200
DBMS_STATS:  adjusted coverage: .997
DBMS_STATS: hist_type in exec_get_topn: 2048 ndv:506 mnb:200
DBMS_STATS: Evaluating frequency histogram for col: "C1"
DBMS_STATS:  number of values = 200, max # of buckects = 200, pct = 100, ssize = 119995
DBMS_STATS:   csr.hreq: 1  Histogram gathering flags: 2063
DBMS_STATS: done_hist in process_topn: TRUE  csr.ccnt: 1
DBMS_STATS: Mark column "C1" as top N computed
DBMS_STATS:  no histogram: setting density to 1/ndv (0)
DBMS_STATS: Skip topn computed column "C1" numhist: 0

=============================================================================
DBMS_STATS: Statistics from clist:
DBMS_STATS: =================================================================
DBMS_STATS: Number of rows in the table = 119995
DBMS_STATS: COL_NAME                       ACL       NV        SNNVDV    NDV       SNDV      DENS      CCNT     
DBMS_STATS: ----------------------------------------------------------------------------------------------------
DBMS_STATS: C1                             3.004E+00 0         119995    506       506       .00000416 1        
DBMS_STATS:          min: Typ=2 Len=2: c1,2                                                                     
DBMS_STATS:          max: Typ=2 Len=3: c2,64,64                                                                 
DBMS_STATS:          Histograms:
DBMS_STATS:          ---------------------------------------------------------------------------------------------------
DBMS_STATS:          BVAL   RPCNT    EAVAL                                                            ENVAL    EDVAL                                                
DBMS_STATS:          ---------------------------------------------------------------------------------------------------
DBMS_STATS:          20998           C102                                                             1        Typ=2 Len=2: c1,2                                    
DBMS_STATS:          41997           C103                                                             2        Typ=2 Len=2: c1,3                                    
DBMS_STATS:          111995          C104                                                             3        Typ=2 Len=2: c1,4                                    
DBMS_STATS:          115995          C105                                                             4        Typ=2 Len=2: c1,5                                    
DBMS_STATS:          118995          C106                                                             5        Typ=2 Len=2: c1,6                                    
DBMS_STATS:          119495          C107                                                             6        Typ=2 Len=2: c1,7                                    
DBMS_STATS:          119496          C26002                                                           9501     Typ=2 Len=3: c2,60,2                                 
DBMS_STATS:          119497          C26007                                                           9506     Typ=2 Len=3: c2,60,7                                 
DBMS_STATS:          119498          C26008                                                           9507     Typ=2 Len=3: c2,60,8                                 
DBMS_STATS:          119499          C2600B                                                           9510     Typ=2 Len=3: c2,60,b                                 
              ........
DBMS_STATS:          119687          C2645E                                                           9993     Typ=2 Len=3: c2,64,5e                                
DBMS_STATS:          119688          C2645F                                                           9994     Typ=2 Len=3: c2,64,5f                                
DBMS_STATS:          119689          C26464                                                           9999     Typ=2 Len=3: c2,64,64                                
DBMS_STATS:          Need Actual Values (DSC_EAVS)
DBMS_STATS:          Histogram Type: TOP-FREQUENCY Data Type: 2
DBMS_STATS:          Histogram Flags: 8196 Histogram Gathering Flags: 2318
DBMS_STATS:          Incremental: FALSE Fix Control 13583722: 1

hybrid histogram

Frequency Histogram不合适

DBMS_STATS: start processing top n values for column "C1"
DBMS_STATS:   >> frequency histograms is not feasible
                       (topn_values is null), skip!

尝试hybrid histogram

DBMS_STATS:  bktnum=-1, nnv=9999, snnv=9999, sndv=8002, est_ndv=8002, mnb=254
DBMS_STATS:  Trying hybrid histogram
如前面所述sql

DBMS_STATS:  > cdn 9999, popFreq 1999, popCnt 2, bktSize 27.89243027888446215139442231075697211155, bktSzFrc .89243027888446215139442231075697211155
DBMS_STATS:  Evaluating hybrid histogram:  cht.count 254, mnb 254, ssize 9999, min_ssize 2500, appr_ndv  TRUE, ndv 8002, selNdv 2, selFreq 1999, pct 100, avg_bktsize 39, csr.hreq FALSE, normalize TRUE
DBMS_STATS:  scaled density=.000111098766803688479057882457504721697589,invden=9001.000000000000000000000000000000000013
DBMS_STATS:   Histogram gathering flags: 15
DBMS_STATS:  Accepting histogram

存在两个popular数据,因此采用hybrid histogram。从下面可以看到12两个值是popular value,frequency分别是9991000。

====================================================================================================
DBMS_STATS: Statistics from clist:
DBMS_STATS: ====================================================================================================
DBMS_STATS: Number of rows in the table = 9999
DBMS_STATS: COL_NAME                       ACL       NV        SNNVDV    NDV       SNDV      DENS      CCNT     
DBMS_STATS: ----------------------------------------------------------------------------------------------------
DBMS_STATS: C1                             3.792E+00 0         9999      8002      8002      .000111   1        
DBMS_STATS:          min: Typ=2 Len=2: c1,2                                                                     
DBMS_STATS:          max: Typ=2 Len=3: c2,64,64                                                                 
DBMS_STATS:          Histograms:
DBMS_STATS:          ---------------------------------------------------------------------------------------------------
DBMS_STATS:          BVAL   RPCNT    EAVAL                                                            ENVAL    EDVAL                                                
DBMS_STATS:          ---------------------------------------------------------------------------------------------------
DBMS_STATS:          999    999      C102                                                             1        Typ=2 Len=2: c1,2                                    
DBMS_STATS:          1999   1000     C103                                                             2        Typ=2 Len=2: c1,3                                    
DBMS_STATS:          2027   1        C2151C                                                           2027     Typ=2 Len=3: c2,15,1c                                
DBMS_STATS:          2055   1        C21538                                                           2055     Typ=2 Len=3: c2,15,38                                
DBMS_STATS:          2083   1        C21554                                                           2083     Typ=2 Len=3: c2,15,54          
       ......                      
DBMS_STATS:          9000   1        C25B                                                             9000     Typ=2 Len=2: c2,5b                                   
DBMS_STATS:          9999   1        C26464                                                           9999     Typ=2 Len=3: c2,64,64                                
DBMS_STATS:          Need Actual Values (DSC_EAVS)
DBMS_STATS:          Histogram Type: HYBRID Data Type: 2
DBMS_STATS:          Histogram Flags: 4 Histogram Gathering Flags: 14
DBMS_STATS:          Incremental: FALSE Fix Control 13583722: 1
DBMS_STATS: ----------------------------------------------------------------------------------------------------

指定采样率,height-balanced histogram

params

指定estimate_percent 10%

DBMS_STATS: gather_table_stats:
<params><param name="block_sample" val="FALSE"/>
<param name="cascade" val="NULL"/>
<param name="concurrent" val="FALSE"/>
<param name="degree" val="NULL"/>
<param name="estimate_percent" val="10"/> //指定estimate_percent 10%
<param name="force" val="FALSE"/>
<param name="granularity" val="AUTO"/>
<param name="method_opt" val="FOR ALL COLUMNS SIZE AUTO"/>
<param name="no_invalidate" val="NULL"/>
<param name="ownname" val="SYS"/>
<param name="partname" val=""/>
<param name="reporting_mode" val="FALSE"/>
<param name="statid" val=""/>
<param name="statown" val=""/>
<param name="stattab" val=""/>
<param name="stattype" val="DATA"/>
<param name="tabname" val="T"/>
</params>

建立临时表

CREATE GLOBAL TEMPORARY TABLE sys.ora_temp_1_ds_20012 sharing = NONE ON COMMIT PRESERVE ROWS CACHE NOPARALLEL
AS SELECT
    /*+  no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring xmlindex_sel_idx_tbl no_substrb_pad  */
    "C1",
    "C2"
FROM
    "SYS"."T" SAMPLE (10.0000000000) T
WHERE
    1 = 2

授权
 grant select,insert on sys.ora_temp_1_ds_20012 to "SYS"

插入采样数据

INSERT /*+ append */
INTO sys.ora_temp_1_ds_20012 SELECT
    /*+  no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring xmlindex_sel_idx_tbl no_substrb_pad  */
    "C1",
    "C2"
FROM
    "SYS"."T" SAMPLE (10.0000000000) T
UNION ALL
    SELECT
        "C1",
        "C2"
    FROM
        sys.ora_temp_1_ds_20012
    WHERE
        1 = 0

初步分析

SELECT
    /*+  no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring xmlindex_sel_idx_tbl no_substrb_pad  */
    COUNT (*),
    COUNT ("C1"),
    SUM (SYS_OP_OPNSIZE("C1")),
    COUNT ("C2"),
    SUM (SYS_OP_OPNSIZE("C2"))
FROM
    sys.ora_temp_1_ds_20012 T

列分析

NTILE函数:窗口函数,根据给出的分组数和数据记录,计算出每个分组的大小,
然后依次设置每条数据记录的分组编号;当前分组如果有空间就放入当前分组,否则放入下一个分组。

由于是采样分析,如果满足kkesdv放缩条件,则进行kkesdv放缩。

如果满足线性放缩条件则进行线性放缩。

**注:
在12c之前,AUTO_SAMPLE_SIZE不会直接做full table scan分析NDV,而是使用采样方式。
因此12c之前的AUTO_SAMPLE_SIZE方式,当小的采样比上述两种放缩都不满足的时候,则调高采样比。**

DBMS_STATS: Building Histogram for C1
DBMS_STATS:  bktnum=-1, nnv=1226880, snnv=122688, sndv=, est_ndv=636345, mnb=254
DBMS_STATS:  Trying height balanced histogram

SELECT
    MIN (minbkt),
    maxbkt,
    SUBSTRB (
        DUMP (MIN(val), 16, 0, 64),
        1,
        240
    ) minval,
    SUBSTRB (
        DUMP (MAX(val), 16, 0, 64),
        1,
        240
    ) maxval,
    SUM (rep) sumrep,
    SUM (repsq) sumrepsq,
    MAX (rep) maxrep,
    COUNT (*) bktndv,
    SUM (CASE WHEN rep = 1 THEN 1 ELSE 0 END) unqrep
FROM
    (
        SELECT
            val,
            MIN (bkt) minbkt,
            MAX (bkt) maxbkt,
            COUNT (val) rep,
            COUNT (val) * COUNT (val) repsq
        FROM
            (
                SELECT
                    /*+ no_expand_table(t) index_rs(t)   no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring xmlindex_sel_idx_tbl no_substrb_pad  */
                    "C1" val,
                    NTILE (254) OVER (ORDER BY "C1") bkt
                FROM
                    sys.ora_temp_1_ds_20012 T
                WHERE
                    "C1" IS NOT NULL
            )
        GROUP BY
            val
    )
GROUP BY
    maxbkt
ORDER BY
    maxbkt

  DBMS_STATS:  Evaluating height-balanced histogram:  cht.count 254, ssize 122688, min_ssize 2500, appr_ndv  FALSE, popcnt 1026, popcntsq 1052676, pct 10, csr.hreq FALSE
  DBMS_STATS:  scaling density: pct=10,ssize=122688,popcnt=1026,ssizesq=1777800,popcntsq=1052676,slsv=0,invden=20584.7102785178810796498254091713968921
  DBMS_STATS:  kkesdv_p: sndv=20584.7102785178810796498254091713968921,snnv=122688,nnv=1226880,hind=0,slsv=0
  DBMS_STATS:  totcnt=1,popndv=0,lsv=0
  DBMS_STATS:  npndv=20624
  DBMS_STATS:  scaled density=.00004848719937936384794414274631497284716835,invden=20624
  DBMS_STATS:   Histogram gathering flags: 15

采样下的频率直方图

DBMS_STATS: Building Histogram for C2
DBMS_STATS:  bktnum=-1, nnv=1226880, snnv=122688, sndv=, est_ndv=10, mnb=254
DBMS_STATS:  Trying frequency histogram

SELECT
    SUBSTRB (DUMP(val, 16, 0, 64), 1, 240) ep,
    cnt
FROM
    (
        SELECT
            /*+ no_expand_table(t) index_rs(t)   no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring xmlindex_sel_idx_tbl no_substrb_pad  */
            "C2" val,
            COUNT (*) cnt
        FROM
            sys.ora_temp_1_ds_20012 T
        WHERE
            "C2" IS NOT NULL
        GROUP BY
            "C2"
    )
ORDER BY
    val

  DBMS_STATS: Evaluating frequency histogram for col: "C2"
  DBMS_STATS:  number of values = 10, max # of buckects = 254, pct = 10, ssize = 122688
  DBMS_STATS:   csr.hreq: 0  Histogram gathering flags: 1035
  DBMS_STATS: Scaling NDV of C1
  DBMS_STATS:  Need larger sample: sndv = 116857, snnvdv = 122688, nnv = 1226880, ndv = 629530
  DBMS_STATS: Scaling NDV of C2
  DBMS_STATS:  kkesdv_p: sndv=10,snnv=122688,nnv=1226880,hind=255,slsv=0
  DBMS_STATS:  cht.count=264
  DBMS_STATS:  Frequency Histogram
  DBMS_STATS:  kkesdv scaling or variant, ndv=10

直方图结果

由于使用采样所以hybrid_enabled为FALSE

C1使用了height-balanced histogram,C2使用了frequency histogram。

DBMS_STATS: Start fill_cstats - hybrid_enabled: FALSE
DBMS_STATS: ====================================================================================================
DBMS_STATS: Statistics from clist:
DBMS_STATS: ====================================================================================================
DBMS_STATS: Number of rows in the table = 1226880
DBMS_STATS: COL_NAME                       ACL       NV        SNNVDV    NDV       SNDV      DENS      CCNT     
DBMS_STATS: ----------------------------------------------------------------------------------------------------
DBMS_STATS: C1                             4.918E+00 0         122688    629530    116857    .00004848 1        
DBMS_STATS:          min: Typ=2 Len=2: c1,2                                                                     
DBMS_STATS:          max: Typ=2 Len=4: c3,64,64,64                                                              
DBMS_STATS:          Histograms:
DBMS_STATS:          ---------------------------------------------------------------------------------------------------
DBMS_STATS:          BVAL   RPCNT    EAVAL                                                            ENVAL    EDVAL                                                
DBMS_STATS:          ---------------------------------------------------------------------------------------------------
DBMS_STATS:          0               C102                                                             1        Typ=2 Len=2: c1,2                                    
DBMS_STATS:          1               C105                                                             4        Typ=2 Len=2: c1,5                                    
DBMS_STATS:          2               C107                                                             6        Typ=2 Len=2: c1,7                                    
DBMS_STATS:          4               C109                                                             8        Typ=2 Len=2: c1,9                                    
DBMS_STATS:          5               C10A                                                             9        Typ=2 Len=2: c1,a                                    
DBMS_STATS:          6               C10C                                                             11       Typ=2 Len=2: c1,c                                    
DBMS_STATS:          7               C20F05                                                           1404     Typ=2 Len=3: c2,f,5
                      ......
DBMS_STATS:          252             C3640404                                                         990303   Typ=2 Len=4: c3,64,4,4                               
DBMS_STATS:          253             C364364A                                                         995373   Typ=2 Len=4: c3,64,36,4a                             
DBMS_STATS:          254             C3646464                                                         999999   Typ=2 Len=4: c3,64,64,64                             
DBMS_STATS:          Need Actual Values (DSC_EAVS)
DBMS_STATS:          Histogram Type: HEIGHT-BALANCED Data Type: 2
DBMS_STATS:          Histogram Flags: 4 Histogram Gathering Flags: 14
DBMS_STATS:          Incremental: FALSE Fix Control 13583722: 1   


DBMS_STATS: ----------------------------------------------------------------------------------------------------
DBMS_STATS: COL_NAME                       ACL       NV        SNNVDV    NDV       SNDV      DENS      CCNT     
DBMS_STATS: ----------------------------------------------------------------------------------------------------
DBMS_STATS: C2                             2.902E+00 0         122688    10        10        .00000040 1        
DBMS_STATS:          min: Typ=2 Len=1: 80                                                                       
DBMS_STATS:          max: Typ=2 Len=2: c1,a                                                                     
DBMS_STATS:          Histograms:
DBMS_STATS:          ---------------------------------------------------------------------------------------------------
DBMS_STATS:          BVAL   RPCNT    EAVAL                                                            ENVAL    EDVAL                                                
DBMS_STATS:          ---------------------------------------------------------------------------------------------------
DBMS_STATS:          12001           80                                                               0        Typ=2 Len=1: 80                                      
DBMS_STATS:          24318           C102                                                             1        Typ=2 Len=2: c1,2                                    
DBMS_STATS:          36598           C103                                                             2        Typ=2 Len=2: c1,3                                    
DBMS_STATS:          49002           C104                                                             3        Typ=2 Len=2: c1,4                                    
DBMS_STATS:          61313           C105                                                             4        Typ=2 Len=2: c1,5                                    
DBMS_STATS:          73615           C106                                                             5        Typ=2 Len=2: c1,6                                    
DBMS_STATS:          86001           C107                                                             6        Typ=2 Len=2: c1,7                                    
DBMS_STATS:          98187           C108                                                             7        Typ=2 Len=2: c1,8                                    
DBMS_STATS:          110417          C109                                                             8        Typ=2 Len=2: c1,9                                    
DBMS_STATS:          122688          C10A                                                             9        Typ=2 Len=2: c1,a                                    
DBMS_STATS:          Need Actual Values (DSC_EAVS)
DBMS_STATS:          Histogram Type: FREQUENCY Data Type: 2
DBMS_STATS:          Histogram Flags: 4100 Histogram Gathering Flags: 1034
DBMS_STATS:          Incremental: FALSE Fix Control 13583722: 1
DBMS_STATS: ----------------------------------------------------------------------------------------------------
DBMS_STATS: arlen = 8 ssize = 122688
DBMS_STATS: prepare reporting structures...                              

删除临时表

DBMS_STATS: truncate table sys.ora_temp_1_ds_20012
DBMS_STATS: drop table sys.ora_temp_1_ds_20012
要在C++中实现类似于Matlab中的直方图,你可以使用第三方库如OpenCV来完成。以下是一个使用OpenCV的示例代码: ```cpp #include <iostream> #include <opencv2/opencv.hpp> int main() { // 读取图像 cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 检查图像是否成功加载 if (image.empty()) { std::cout << "无法读取图像文件" << std::endl; return -1; } // 定义直方图参数 int histSize = 256; // 直方图的bin数量 float range[] = { 0, 256 }; // 像素值范围 const float* histRange = { range }; // 计算直方图 cv::Mat histogram; cv::calcHist(&image, 1, nullptr, cv::Mat(), histogram, 1, &histSize, &histRange); // 创建画布 int histWidth = 512, histHeight = 400; int binWidth = cvRound((double)histWidth / histSize); cv::Mat histImage(histHeight, histWidth, CV_8UC3, cv::Scalar(0, 0, 0)); // 归一化直方图数据 cv::normalize(histogram, histogram, 0, histImage.rows, cv::NORM_MINMAX); // 绘制直方图 for (int i = 1; i < histSize; i++) { cv::line(histImage, cv::Point(binWidth * (i - 1), histHeight - cvRound(histogram.at<float>(i - 1))), cv::Point(binWidth * (i), histHeight - cvRound(histogram.at<float>(i))), cv::Scalar(255, 255, 255), 2, 8, 0); } // 显示图像和直方图 cv::imshow("Image", image); cv::imshow("Histogram", histImage); cv::waitKey(0); return 0; } ``` 在这个示例中,我们首先读取了一张灰度图像。然后,我们使用`calcHist`函数计算图像的直方图。接下来,我们创建了一个画布来绘制直方图,并使用`normalize`函数将直方图数据归一化到画布的高度范围内。最后,我们使用`line`函数在画布上绘制直方图。 请注意,这个示例假设你已经安装了OpenCV库,并且将图像文件命名为"image.jpg"放在同一目录下。你需要根据自己的实际情况进行相应的调整。 希望这个示例能帮到你!如果你有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值