drop table T1 purge;

create table T1 tablespace TS1 as
select 
    rownum id,
    decode(mod(rownum,10),0,10,1) col1
from   ( select 1 just_a_column
         from DUAL
         connect by level <= 100000
       )
/


---------

drop table T1 purge;

create table T1 tablespace TS1 as
select 
    rownum id,
    decode(mod(rownum,3),0,'m3',
    decode(mod(rownum,5),0,'m5',
    decode(mod(rownum,7),0,'m7',
    decode(mod(rownum,11),0,'m11',
    decode(mod(rownum,13),0,'m13',
    decode(mod(rownum,17),0,'m17',
    'other')))))) col1
from   ( select 1 just_a_column
         from DUAL
         connect by level <= 100000
       )
/


------------



drop table T1 purge;

create table T1 tablespace TS1 as
select 
    rownum id,
    case when rownum<=10 then rownum else 99999 end col1,
    case when rownum<=400 then rownum else 99999 end col2,
    case when rownum<=4000 then rownum else 99999 end col3,
    case when rownum<=10000 then rownum else 99999 end col4
from   ( select 1 just_a_column
         from DUAL
         connect by level <= 100000
       )
/


---------

drop table T1 purge;

create table T1 tablespace TS1 as
select 
    rownum id,
    case when rownum>=1 and rownum<1000 then mod(rownum,10) else 99999 end col1,
    case when rownum>=1 and rownum<99900 then mod(rownum,1000) else rownum end col2,
    mod(rownum,300) col3
from   ( select 1 just_a_column
         from DUAL
         connect by level <= 100000
       )
/



---------

drop table T1 purge;

create table T1 tablespace TS1 as
select 
    rownum id,
    mod(rownum,254) col1,
    mod(rownum,255) col2,
    mod(rownum,256) col3
from   ( select 1 just_a_column
         from DUAL
         connect by level <= 100000
       )
/





exec dbms_stats.gather_table_stats(user,'T1', method_opt=>'for all columns size SKEWONLY');


select column_name,num_distinct,density,num_nulls,num_buckets,sample_size,histogram  
from user_tab_col_statistics  
where table_name='T1'; 




select endpoint_value as column_value, 
endpoint_number as cummulative_frequency, 
endpoint_number - lag(endpoint_number,1,0) over (order by endpoint_number) as frequency 
from user_tab_histograms 
where table_name = 'T1' and column_name = 'COL4'; 



select col1,count(*) from T1 group by col1 order by 2 desc; 



--------------------

https://www.red-gate.com/simple-talk/databases/oracle-databases/12c-histogram-top-frequency/

drop table T_TopFreq purge;
create table T_TopFreq as
select
    rownum n1
    , case when mod(rownum, 100000)   = 0 then   90
           when mod(rownum, 10000)    = 0 then   180
           when mod(rownum, 1000)     = 0 then   84
           when mod(rownum, 100)      = 0 then   125
           when mod(rownum,50)        = 2 then   7
           when mod(rownum-1,80)      = 2 then   22
           when mod(rownum, 10)       = 0 then   19
           when mod(rownum-1,10)      = 5 then   15
           when mod(rownum-1,5)       = 1 then   11
           when trunc((rownum -1/3)) < 5  then   25
           when trunc((rownum -1/5)) < 20  then   33
           else 42
        end n2
from dual
connect by level <= 2e2
/


set serveroutput ON

exec dbms_stats.set_global_prefs ('TRACE', to_char (1+16));
exec dbms_stats.gather_table_stats (user,'T_TOPFREQ',method_opt=> 'for columns n2 size 8');
exec dbms_stats.set_global_prefs('TRACE', null);


select
         sum (cnt) TopNRows
      from (select
               n2
              ,count(*) cnt
            from t_topfreq
            group by n2
            order by count(*) desc
            )
     where rownum <= 8;

with FREQ as 
( select
               n2
              ,count(*) cnt
            from t_topfreq
            group by n2
            order by count(*) desc
)
select sum(cnt) from FREQ where rownum<=8;



select column_name,num_distinct,density,num_nulls,num_buckets,sample_size,histogram  
from user_tab_col_statistics  
where table_name='T_TOPFREQ'; 






--------------------------------------------------------------

drop table T1 purge;

create table T1 tablespace TS1 as
select 
    rownum id,
    mod(rownum,300) col1
from   ( select 1 just_a_column
         from DUAL
         connect by level <= 100e3
       )
/

update T1 set col1=567 where id between 70e3 and 75e3;
update T1 set col1=678 where id between 75e3 and 90e3;
update T1 set col1=789 where id between 90e3 and 100e3;

exec dbms_stats.gather_table_stats(user,'T1', method_opt=>'for all columns size SKEWONLY');

-- type de histogram
select column_name,num_distinct,density,num_nulls,num_buckets,sample_size,histogram  
from user_tab_col_statistics  
where table_name='T1'; 


-- how many rows are in the TOP-N values ?
with FREQ as 
( select
               col1
              ,count(*) cnt
            from T1
            group by col1
            order by count(*) desc
)
select sum(cnt) from FREQ where rownum<=254
;

-- frequency by column value / bucket 
select endpoint_value as column_value, 
endpoint_number as cummulative_frequency, 
endpoint_number - lag(endpoint_number,1,0) over (order by endpoint_number) as frequency,
ENDPOINT_REPEAT_COUNT
from user_tab_histograms 
where table_name = 'T1' and column_name = 'COL1'; 



--------------------------------------------------------------

--------------------------------------------------------------

drop table T1 purge;

create table T1 tablespace TS1 as
select 
    rownum id,
    mod(rownum,2000) col1
from   ( select 1 just_a_column
         from DUAL
         connect by level <= 1000e3
       )
/


exec dbms_stats.gather_table_stats(user,'T1', method_opt=>'for all columns size 2048');

-- type de histogram
select column_name,num_distinct,density,num_nulls,num_buckets,sample_size,histogram  
from user_tab_col_statistics  
where table_name='T1'; 


