비용계산방법
ANALYZE TABLE EC_APPLY COMPUTE STATISTICS;
ANALYZE INDEX EC_APPLY_COMPANY_IDX COMPUTE STATISTICS;
1) FTS
COST = 전체블록수/DB_FILE_MULTIBLOCK_READ_COUNT
SELECT TABLE_NAME, BLOCKS FROM USER_TABLES
WHERE TABLE_NAME='EC_APPLY'; --> RESULT : 13474 BLOCKS
SHOW PARAMETER DB_FILE_MULTIBLOCK_READ_COUNT --> RESULT : 8
COST = 13474/8 = 1684.25 (약 1685번) 검색으로 전체 데이터 검색
2) INDEX SCAN
COST = 1/선택도*클러스터링팩터
선택도 : 전체행에 대한 WHERE 조건절에 의해 검색되는 행의 비율
SELECT DISTINCT COMPANY_NO FROM EC_APPLY; --> RESULT : 2800 ROW
클러스터링팩터:하나의 인덱스가 몇개의 블록에 저장되어 있는지 나타내는 비율
SELECT INDEX_NAME, CLUSTERING_FACTOR FROM USER_INDEXES
WHERE INDEX_NAME = 'EC_APPLY_COMPANY_IDX'; --> RESULT : 79816
COST = 1/2800*79816 (약 29번) 검색으로 인덱스를 읽었음
set autot on
SELECT * FROM EC_APPLY WHERE COMPANY_NO = '6208100119';
<<COST 용어>>
1. selectivity
행집합으로부터의 행들의 일부분 검색 을 나타냄
0.0 ~ 1.0
0.0 : 아무값도 없음
1.0 : 모든행 선택
(1) where ename = '홍길동'
(2) where ename like '홍%'
(1)번보다 (2)이 더 많은 값 검색
selectivity는 해당 컬럼의 유일 값(distinct value)의 갯수에 따라 반비례하여 설정된다.
즉 distinct 값이 많으면 조건에 의해서 선택되는 값은 줄어듬.
2. cardinality
행집합에서 행의 수 (행집합은 기본테이블, 뷰, 조인, group by의 결과일 수도 있음)
(1)base cardinality : 테이블을 분석하면 나타남(통계정보생성)
(2)effective cardinality : 기본테이블로부터 선택되어진 행의 수
(조건절에 의한 행을 의미함, 조건절이 없으면 effective와 base cardinality는 같음)
(3)join cardinality : 두행 집합이 함꼐 조인되었을때 생산된 행의 수
(조인조건의 selectivity에 의해 곱해진 두행 집합의 cardinality곱)
(4)distinct cardinality : 행집합의 컬럼에 유일한 값의 수
(5)group cardinality : group by 연산 후에 행집합에서 생성된 행의 수.
group by는 행의 수를 줄여줌. distinct cardinality와 행집합의 행의 수에 의존적으로 변경됨. 그룹컬럼이 하나라면 그 컬럼의 distinct card와 같음, 그러나 그룹컬럼이 두개 이상이라면 최대 각컬럼의 distinct card가 되고, 최소는 각컬럼의 distinct card의 곱에서 행집합의 행의 수로 제한된다.결과는 총 행집합의 행의수보다 무조건 작으므로 distinct card가 가장 낮은 컬럼의 값과 행집합의 수 사이로 결정됨)
SELECT EMPNO, ENAME FROM EMP WHERE EMPNO = 7369; ->UNIQUE이므로 COST = 1, 1건의 ROW이므로 CARD=1
SELECT EMPNO, ENAME FROM EMP WHERE EMPNO IN (7369,7654); ->UNIQUE이므로 COST = 1, 2건의 ROW이므로 CARD=2
SELECT EMPNO, ENAME FROM EMP WHERE EMPNO IN (7369,7654,7788);->UNIQUE이므로 COST = 1, 3건의 ROW이므로 CARD=3
SELECT EMPNO, ENAME FROM EMP WHERE EMPNO IN (7369,7654,7788,7900);->UNIQUE이므로 COST = 1, 4건의 ROW이므로 CARD=4
|