전체포스팅 낚시이야기 자동차정보 여행/맛집 이슈이야기 기타이야기 재테크정보 취업정보 전문대정보 데이터베이스

클러스터링 팩터(Clustering Factor)


클러스터링 팩터는 우리말로 하자면 군집성 계수 즉 데이터가 모여있는 정도라고 번역할수 있다. 이는 데이터가 특정 컬럼을 기준으로 같은 값을 갖는

이터가 모여있는 정도를 말하는데 흔히들 인덱스 클러스터링 팩터가 좋다라고 한다면 인덱스의 정렬순서와 테이블의 정렬순서가 비슷하여 스캔비용

이용이 적게 드는것을 말한다.

클러스터링팩터는 인덱스 스캔시의 비용(cost)에 영향을 미치며, dba_indexes, all_indexes, user_indexes의 인덱스뷰의 클러스터링팩터라는 컬럼을

통해 확인할수 있다.



클러스터링 팩터의 계산방식


오라클에서의 클러스터링 팩터의 계산방식은 카운터변수를 선언하고 인덱스 리프블록을 처음부터 끝까지 스캔해가며, 인덱스 ROWID로부터 블록번호

취해 현재 읽고 있는 인덱스 레코드의 블록번호가 바로 직전에 읽은 레코드의 블록 번호와 다를 때마다 counter값을 1씩 증가시킨다. 스캔을 완료후

최종 카운터 변수 값을 인덱스통계에 클러스터링팩터 컬럼에 저장한다.





테이블 통계수집을 통하지 않고 클러스터링 팩터를 구하는 쿼리
----------------------------------------------
-- @name: manual_clustering_factor
-- @author: dion cho
-- @description: test for calculationg clustering factor manually
----------------------------------------------

define __IND_NAME = &1
define __SAMPLE = &2

set serveroutput on

declare
  v_cursor      sys_refcursor;
  v_cols        varchar2(4000);
  v_tbl         varchar2(4000);
  v_sample      varchar2(4000);
  v_tmp         varchar2(4000);
  v_fno         number;
  v_bno         number;
  v_prev_fno    number;
  v_prev_bno    number;
  v_cf          number := 0;
  v_acf         number := 0;
begin

  open v_cursor for
     'select column_name ' ||
     'from user_ind_columns ' ||
     'where index_name = upper(''&__IND_NAME'') ' ||
     'order by column_position';
  loop
   fetch v_cursor into v_tmp;
   exit when v_cursor%notfound;
   v_cols := v_cols||', ' || v_tmp;
  end loop;

  close v_cursor;

  v_cols := substr(v_cols, 2);
  dbms_output.put_line('Columns = ' || v_cols);

  select table_name into v_tbl
  from user_indexes
  where index_name = upper('&__IND_NAME')
  ;

  dbms_output.put_line('Table = ' || v_tbl);

  select decode(&__SAMPLE,100,' ',' sample(&__SAMPLE) ') into v_sample
  from dual
  ;

  open v_cursor for
     'select /*+ full(' || v_tbl || ') */ ' ||
     '       dbms_rowid.rowid_block_number(rowid) ' ||
     '       ,dbms_rowid.rowid_relative_fno(rowid) ' ||
     'from ' || v_tbl || v_sample ||
     'order by ' || v_cols
     ;
  loop
   fetch v_cursor into v_bno, v_fno;
   exit when v_cursor%notfound;
   if(v_prev_fno <> v_fno or v_prev_bno <> v_bno) then
     v_cf := v_cf + 1;
   end if;
   v_prev_fno := v_fno;
   v_prev_bno := v_bno;
  end loop;

  close v_cursor;

  v_cf := v_cf + 1;
  v_acf := trunc(v_cf * 100 / &__SAMPLE);

  dbms_output.put_line('Caculated Clustering Factor = ' || v_cf);
  dbms_output.put_line('Adjusted Clusetring Factor = ' || v_acf);

end;
/

set serveroutput off



-- sys_op_countchg
select /*+ index(t1 t1(c1)) */
  sys_op_countchg(substrb(rowid, 1, 15), 1) as cf
from t1
where c1 is not null
;


select /*+ index(t1 t1(c2)) */
  sys_op_countchg(substrb(rowid, 1, 15), 1) as cf
from t1
where c2 is not null
;


  "DATABASE / ORACLE" 분류의 다른 글

- SQL 트레이스 걸기2013/08/23
- 오라클 유용한 힌트 모음2013/08/20
- 오라클 다이나믹뷰 정리2013/08/20
- [성능진단] 메모리를 많이 사용하는 상위 10개 SQL 추출 쿼리2013/08/20

Posted by 고래아빠

, , , , , ,
Response
309 Trackbacks , No Comment
RSS :
http://whale.oceanmate.co.kr/rss/response/3

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

« Previous : 1 : 2 : 3 : 4 : 5 : Next »

Archives

Recent Comments

Calendar

«   2018/02   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28      

Site Stats

Total hits:
301907
Today:
33
Yesterday:
51