修改统计信息的最值

-- 下面是显示最值的方法
declare
    min_date date;
   max_date date;
begin
   dbms_stats.convert_raw_value('78700B06143B28',min_date);
   dbms_stats.convert_raw_value('7873020F01070D',max_date);
   dbms_output.put_line('min_date is '|| to_char(min_date,'yyyy-mm-dd hh24:mi:ss'));
   dbms_output.put_line('max_date is '|| to_char(max_date,'yyyy-mm-dd hh24:mi:ss')); 
end; 
/

-- 获得当前统计信息中的最值和直方图信息,主要看srec
DECLARE
   srec               DBMS_STATS.STATREC;
   v_distcnt          NUMBER;
   v_density          NUMBER;
   v_nullcnt          NUMBER;
   v_avgclen          NUMBER;
   numvals            DBMS_STATS.NUMARRAY;
   charvals           DBMS_STATS.CHARARRAY;
   datevals           DBMS_STATS.DATEARRAY;  
BEGIN
   -- Date Type                               
   DBMS_STATS.get_column_stats (ownname      => 'GIMDATA',
                                tabname      => 'GIM_MSG_INFO',
                                colname      => 'DATE_CREATED',
                                distcnt      => v_distcnt,
                                density      => v_density,
                                nullcnt      => v_nullcnt,
                                srec         => srec,
                                avgclen      => v_avgclen
                               );     
   datevals := DBMS_STATS.datearray (to_date('2012-11-06 19:58:39','yyyy-mm-dd hh24:mi:ss'), to_date('2015-02-15 00:06:12','yyyy-mm-dd hh24:mi:ss'));


-- 准备好要设置的最值,后面可以用dbms_stats.set_column_stats来设置
   DBMS_STATS.prepare_column_values (srec, datevals);
                                        DBMS_STATS.set_column_stats (ownname      => 'GIMDATA',
                                tabname      => 'GIM_MSG_INFO',
                                colname      => 'DATE_CREATED',
                                srec         => srec
                               );
   COMMIT;
END;
/

--------------------------------------------------------------------
                设置字段最大值最小值
--------------------------------------------------------------------
DECLARE
   srec               DBMS_STATS.STATREC;
   v_distcnt          NUMBER;
   v_density          NUMBER;
   v_nullcnt          NUMBER;
   v_avgclen          NUMBER;
   numvals            DBMS_STATS.NUMARRAY;
   charvals           DBMS_STATS.CHARARRAY;
   datevals           DBMS_STATS.DATEARRAY;
   
BEGIN

   -- 数值类型
   
   DBMS_STATS.get_column_stats (ownname      => user,
                                tabname      => 'TEST',
                                colname      => 'A',
                                distcnt      => v_distcnt,
                                density      => v_density,
                                nullcnt      => v_nullcnt,
                                srec         => srec,
                                avgclen      => v_avgclen
                               );
  
     
   numvals := DBMS_STATS.numarray (1, 100000);
   
   DBMS_STATS.prepare_column_values (srec, numvals);


   DBMS_STATS.set_column_stats (ownname      => user,
                                tabname      => 'TEST',
                                colname      => 'A',
                                distcnt      => v_distcnt,
                                density      => v_density,
                                nullcnt      => v_nullcnt,
                                srec         => srec,
                                avgclen      => v_avgclen
                               );
               
   -- 字符类型
                               
   DBMS_STATS.get_column_stats (ownname      => user,
                                tabname      => 'TEST',
                                colname      => 'B',
                                distcnt      => v_distcnt,
                                density      => v_density,
                                nullcnt      => v_nullcnt,
                                srec         => srec,
                                avgclen      => v_avgclen
                               );
  
   charvals := DBMS_STATS.chararray ('A_MIN', 'Z_MAX');
   
   DBMS_STATS.prepare_column_values (srec, charvals);


   DBMS_STATS.set_column_stats (ownname      => user,
                                tabname      => 'TEST',
                                colname      => 'B',
                                distcnt      => v_distcnt,
                                density      => v_density,
                                nullcnt      => v_nullcnt,
                                srec         => srec,
                                avgclen      => v_avgclen
                               );
                            
   -- 日期类型
                               
   DBMS_STATS.get_column_stats (ownname      => user,
                                tabname      => 'TEST',
                                colname      => 'C',
                                distcnt      => v_distcnt,
                                density      => v_density,
                                nullcnt      => v_nullcnt,
                                srec         => srec,
                                avgclen      => v_avgclen
                               );
  
     
   datevals := DBMS_STATS.datearray (sysdate-365, sysdate);
   
   DBMS_STATS.prepare_column_values (srec, datevals);


   DBMS_STATS.set_column_stats (ownname      => user,
                                tabname      => 'TEST',
                                colname      => 'C',
                                distcnt      => v_distcnt,
                                density      => v_density,
                                nullcnt      => v_nullcnt,
                                srec         => srec,
                                avgclen      => v_avgclen
                               );


   COMMIT;
END;
/
--------------------------------------------------------------------
               为了显示方便,创建一个函数
--------------------------------------------------------------------
create or replace function display_raw(rawval raw, type varchar2)
  return varchar2 is
  cn  number;
  cv  varchar2(32);
  cd  date;
  cnv nvarchar2(32);
  cr  rowid;
  cc  char(32);
begin
  if (type = 'NUMBER') then
    dbms_stats.convert_raw_value(rawval, cn);
    return to_char(cn);
  elsif (type = 'VARCHAR2') then
    dbms_stats.convert_raw_value(rawval, cv);
    return to_char(cv);
  elsif (type = 'DATE') then
    dbms_stats.convert_raw_value(rawval, cd);
    return to_char(cd);
  elsif (type = 'NVARCHAR2') then
    dbms_stats.convert_raw_value(rawval, cnv);
    return to_char(cnv);
  elsif (type = 'ROWID') then
    dbms_stats.convert_raw_value(rawval, cr);
    return to_char(cnv);
  elsif (type = 'CHAR') then
    dbms_stats.convert_raw_value(rawval, cc);
    return to_char(cc);
  else
    return 'UNKNOWN DATATYPE';
  end if;
end;
/


--------------------------------------------------------------------
               设置前字段的最大值最小值
--------------------------------------------------------------------
COL LOW_VAL FOR A30
COL HIGH_VAL FOR A30
COL DATA_TYPE FOR A30
select
   a.column_name,
   display_raw(a.low_value,b.data_type) as low_val,
   display_raw(a.high_value,b.data_type) as high_val,
   b.data_type
from
   user_tab_col_statistics a, user_tab_cols b
where
   a.table_name='TEST' and
   a.table_name=b.table_name and
   a.column_name=b.column_name
/
COLUMN_NAME                    LOW_VAL                        HIGH_VAL                       DATA_TYPE
------------------------------ ------------------------------ ------------------------------ ------------------------------
A                              2                              1118                           NUMBER
B                              ACCESS$                        XS$VERIFIERS                   VARCHAR2
C                              2009-08-24 14:59:03            2009-08-24 14:59:33            DATE
--------------------------------------------------------------------
               设置后字段的最大值最小值
--------------------------------------------------------------------
COLUMN_NAME                    LOW_VAL                        HIGH_VAL                       DATA_TYPE
------------------------------ ------------------------------ ------------------------------ ------------------------------
A                              1                              100000                         NUMBER
B                              A_MIN                          Z_MAX                          VARCHAR2
C                              2010-09-08 16:48:29            2011-09-08 16:48:29            DATE


--------------------------------------------------------------------
               设置字段A的等高直方图
--------------------------------------------------------------------
declare
 v_distcnt  number;
 v_density  number;
 v_nullcnt  number;
 srec     dbms_stats.statrec;
 v_avgclen  number;
  n_array     dbms_stats.numarray;
begin
   DBMS_STATS.get_column_stats (ownname      => user,
                                tabname      => 'TEST',
                                colname      => 'A',
                                distcnt      => v_distcnt,
                                density      => v_density,
                                nullcnt      => v_nullcnt,
                                srec         => srec,
                                avgclen      => v_avgclen
                               );
  n_array    := dbms_stats.numarray(20, 60, 2000, 3000, 3000, 3000, 3000, 3000, 3000, 4000,  10000);
 srec.bkvals := null;
 srec.epc := 11;


 dbms_stats.prepare_column_values(srec, n_array);
 dbms_stats.set_column_stats(
  ownname  => user,
  tabname  => 'test',
  colname  => 'a',
  distcnt  => v_distcnt,
  density  => v_density,
  nullcnt  => v_nullcnt,
  srec  => srec,
  avgclen  => v_avgclen
 );
end;
/
select endpoint_value,
       endpoint_number,
       lag(endpoint_number, 1) over(order by endpoint_number) prev_number
  from user_tab_histograms
 where table_name = 'TEST'
   and column_name = 'A'
 order by endpoint_value;
ENDPOINT_VALUE ENDPOINT_NUMBER PREV_NUMBER
-------------- --------------- -----------
            20               0
            60               1           0
          2000               2           1
          3000               8           2
          4000               9           8
         10000              10           9
        
--------------------------------------------------------------------
               设置等频A的等频直方图
--------------------------------------------------------------------
declare
 v_distcnt  number;
 v_density  number;
 v_nullcnt  number;
 srec     dbms_stats.statrec;
 v_avgclen  number;
  n_array     dbms_stats.numarray;
begin
   DBMS_STATS.get_column_stats (ownname      => user,
                                tabname      => 'TEST',
                                colname      => 'A',
                                distcnt      => v_distcnt,
                                density      => v_density,
                                nullcnt      => v_nullcnt,
                                srec         => srec,
                                avgclen      => v_avgclen
                               );
 srec.bkvals   := dbms_stats.numarray(20, 60, 80,100,120, 40, 60, 80, 100, 100,240);---------------每个值所对应的频率
  n_array       := dbms_stats.numarray(2,40, 200,300, 400,500,600,700,800,900,1000); ---------按照大小排序
 srec.epc := 11;
 dbms_stats.prepare_column_values(srec, n_array);
 dbms_stats.set_column_stats(
  ownname  => user,
  tabname  => 'test',
  colname  => 'a',
  distcnt  => 11,
  density  => 0.000500501,
  nullcnt  => v_nullcnt,
  srec  => srec,
  avgclen  => v_avgclen
 );
end;
/
ENDPOINT_NUMBER ENDPOINT_VALUE
--------------- --------------
             20              2
             80             40
            160            200
            260            300
            380            400
            420            500
            480            600
            560            700
            660            800
            760            900
           1000           1000
           
select * from test where A=1000;
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   240 |  6480 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TEST |   240 |  6480 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22818880/viewspace-2077107/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22818880/viewspace-2077107/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值