(1) ׷ 
create sequence seq ;

create table member( memb_id number, age number(2) );

exec dbms_random.seed(0);

insert into member(memb_id, age)
select seq.nextval, dbms_random.value( 1,19) from dual connect by level <= 50;
insert into member(memb_id, age)
select seq.nextval, dbms_random.value(20,29) from dual connect by level <= 270;
insert into member(memb_id, age)
select seq.nextval, dbms_random.value(30,39) from dual connect by level <= 330;
insert into member(memb_id, age)
select seq.nextval, 40 from dual connect by level <= 1000;   
insert into member(memb_id, age)
select seq.nextval, dbms_random.value(41,49) from dual connect by level <= 200;
insert into member(memb_id, age)
select seq.nextval, dbms_random.value(50,59) from dual connect by level <= 100;
insert into member(memb_id, age)
select seq.nextval, dbms_random.value(60,99) from dual connect by level <= 50 ;

select case when age between 1 and 19 then '10 '
              when age >= 60 then '60 ̻'
              else floor(age/10)*10 || '' end "ɴ"
     , count(*) ο
from   member
group by case when age between 1 and 19 then '10 '
              when age >= 60 then '60 ̻'
              else floor(age/10)*10 || '' end
order by 1 ;


(2)  ׷

select count(*), count(distinct age) from member;

begin
  dbms_stats.gather_table_stats(user, 'member'
    , method_opt=>'for all columns size 100');
end;
/

select num_distinct, num_buckets, histogram
from   user_tab_col_statistics
where  table_name = 'MEMBER'
and    column_name = 'AGE';

select t.age "", t.cnt "ο()"
     , nvl2(h.prev, h.running_total-h.prev, h.running_total) frequency
     , h.running_total
from   (select age, count(*) cnt from member group by age) t
     , (select endpoint_value age, endpoint_number running_total
             , lag(endpoint_number) over (order by endpoint_value) prev
        from   user_histograms
        where  table_name = 'MEMBER'
        and    column_name = 'AGE') h
where  h.age = t.age ;



(3) ̱ ׷

begin
  dbms_stats.gather_table_stats(user, 'member'
    , method_opt=>'for all columns size 20');
end;
/

select num_distinct, num_buckets, histogram
from   user_tab_col_statistics
where  table_name = 'MEMBER'
and    column_name = 'AGE';

column column_name format a6;
column endpoint_actual_value format a20;

select endpoint_number, endpoint_value
from   user_histograms
where  table_name = 'MEMBER'
and    column_name = 'AGE'
order by 1;


select '~' || age "ɴ", endpoint_number, diff
     , round( 100 * diff / sum(diff) over()) "RATIO(%)"
     , round(t.num_rows * diff / sum(diff) over()) "ο()"
from (select table_name
           , endpoint_value age, endpoint_number
         , endpoint_number-lag(endpoint_number) over 
                                     (order by endpoint_value) diff
           , lag(endpoint_number) over (order by endpoint_value) prev
      from   user_histograms
      where  table_name = 'MEMBER'
      and    column_name = 'AGE') h, user_tables t
where  h.endpoint_number > 0
and    t.table_name = h.table_name
order by 1 ;


-- popular value  õ/īθƼ 
set autotrace traceonly exp;

select * from member where age = 40;

set autotrace off;


-- non-popular value  õ/īθƼ  
select 1/num_distinct, density, round(density*2000) cardinality
from   user_tab_col_statistics
where  table_name = 'MEMBER'
and    column_name = 'AGE' ;

set autotrace traceonly exp;

select * from member where age = 39;

set autotrace off;


(4) ε    īθƼ 
create table t
as
select rownum no from dual connect by level <= 1000;

begin
  dbms_stats.gather_table_stats(user, 't'
    , method_opt=>'for all columns size 254');
end;
/


explain plan for select * from t where no <= :no ;

select * from table(dbms_xplan.display(null, null, 'basic rows')) ;

explain plan for select * from t where no between :no1 and :no2 ;

select * from table(dbms_xplan.display(null, null, 'basic rows')) ;



explain plan for select * from t where no <= 100 ;

select * from table(dbms_xplan.display(null, null, 'basic rows'));

explain plan for select * from t where no between 500 and 600 ;

select * from table(dbms_xplan.display(null, null, 'basic rows'));



(5)  õ

create table 
as
select empno ȣ, ename , sal ޿, sal*0.1  from emp;

begin
  dbms_stats.gather_table_stats(
     user, ''
   , method_opt=>'for columns ޿ size 254  size 254' );
end;
/

set autotrace on explain;

select * from 
where  ޿ >= 2000
and     >= 200 ;


select /*+ dynamic_sampling(4) */ * from 
where  ޿ >= 2000
and     >= 200 ;

