클러스터링 팩터(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' 카테고리의 다른 글
오라클 테이블스페이스별 용량/사용량 조회 쿼리 (0) | 2022.07.27 |
---|---|
오라클 다이나믹뷰 정리 (0) | 2021.12.07 |
SQL 트레이스 걸기 (0) | 2021.12.07 |
오라클 DDL 로그 만들기 (0) | 2021.07.27 |
데이터베이스 용량 산정 (0) | 2021.07.23 |