오라클에서의 클러스터링 팩터의 계산방식은 카운터변수를 선언하고 인덱스 리프블록을 처음부터 끝까지 스캔해가며, 인덱스 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;