Selectivity, Cardinality, Cost

EXPLAIN PLAN명령문으로 쿼리에 대한 실행 계획을 만든 후, PLAN_TABLE에 Cardinality 와 Cost 두 컬럼이 존재 했는데, 이것이 의미하는 것에 대해서 설명해 주십시오.

1. Selectivity

첫 번째 측정 수단인 Selectivity는 행 집합으로부터의 행들의 일부분을 나타냅니다. 행 집합은 기본 테이블, 뷰, 조인이나 GROUP BY의 결과일 수도 있습니다.
Selectivity는 last_name=’Smith’와 같은 제한자(predicate)에 묶여 있습니다. 제한자는 행 집합에서 행들의 특정 수를 걸러내는 필터의 역할을 합니다. 그러므로, 제한자의 Selectivity는 행 집합에서 얼마나 많은 행들이 제한자 테스트를 지나가게 될 것인가를 보여줍니다.
Selectivity는 0.0에서 1.0 사이의 값을 가지고 있습니다.
0.0은 아무런 행도 행 집합에서 선택되지 않은 것이고, 1.0은 모든 행들이 선택된 것입니다. 만약, 통계가 존재하지 않는 다면, Estimator는 Selectivity 를 위해 내부의 기본값을 사용합니다. 제한자의 타입에 따라 다른 내부 기본값이 사용됩니다. 예를 들어, 동등 제한자(last_name = ‘Smith’)를 위한 내부 기본값은 범위 제한자( last_name > ‘Smith’ ) 보다 내부기본값이 더 적습니다. Estimator는 동등 제한자는 범위 제한자 보다 더 적은 부분을 반환할 것이라고 예상하기 때문에 이러한 추정을 합니다. 그러나, 통계가 존재한다면, Estimator는 selectivity를 위한 그것들을 사용합니다. 예를 들면, 동등 연산에서 selectivity는 해당 컬럼의 유일 값(distinct value)의 갯수에 따라 반비례하여 설정됩니다. 만약, 컬럼에 대한 히스토그램(histogram)이 사용가능 하다면, 유일 값 대신 그것을 사용합니다. 히스토그램은 컬럼의 다른 값의 분산도를 저장해 놓습니다. 분포가 불균형인 컬럼에 히스토그램을 사용하면, CBO가 더 낳은 selectivity를 결정하는데 상당하게 도움을 줍니다.

2. Cardinality

Cardinality는 행 집합에서 행의 수를 나타냅니다.

여기에 행 집합은 기본 테이블, 뷰, 조인이나 GROUP BY의 결과일 수도 있습니다.
 
Base cardinality는 기본 테이블에 행의 수입니다.
Base cardinality는 테이블을 분석함으로써 나타날 수 있습니다.
통계가 가능하지 않다면, Estimator는 테이블에 할당된 익스텐트의 수를 근거로 해서 행의 수를 추정합니다.
 
 
Effective cardinality는 기본 테이블로 부터 선택되어진 행의 수를 나타냅니다.
Effective cardinality는 기본 테이블의 행들에 연속적인 필터로써 작용하는 각각의 제한자와 함께 기본 테이블의 다른 컬럼에 정해진 제한자에 의존적입니다. 이것은 기본 테이블의 행 생산물로써 계산되어지고, 테이블에 정해진 모든 제한자들의 selectivity를 합칩니다. 테이블에 어떠한 제한자가 없다면 그것은 base cardinality와 같습니다.
 
Join cardinality는 두 행 집합이 함께 조인되었을 때, 생산된 행의 수입니다.
조인은 결과에 필터로써 적용되는 제한자와 함께 두 행 집합들의 카테션 곱입니다.
그러므로, Join cardinality는 조인 제한자의 selectivity에 의해 곱해진 두 행 집합의
cardinality 곱입니다.
 
Distinct cardinality는 행 집합의 컬럼에 유일한 값의 수입니다.
행 집합의 distinct cardinality는 컬럼의 데이터에 근거합니다.
100개의 행이 있는 행 집합에서 유일한 값의 수가 20 이라면, 이 값은 20이 됩니다.
 
Group cardinality는 GROUP BY 연산 후에 행 집합에서 생성된 행의 수입니다.
GROUP BY연산은 행 집합에서 행의 수를 줄여줍니다. Group cardinality는 그룹화 되는 컬럼의 distinct cardinality와 행 집합의 행의 수에 의존적으로 변경됩니다. 그룹화 되는 컬럼이 하나라면 그 컬럼의 distinct cardinality와 같습니다. 그러나, 그룹화 되는 컬럼이 두개 이상인 경우, 최대 각 컬럼의 distinct cardinality이 될 것이고, 최소로 각 컬럼의 distinct cardinality의 곱에서 행 집합의 행의 수로 제한될 것입니다. 결과는 총 행 집합의 행의 수를 넘지 못하므로, distinct cardinality가 가장 낮은 컬럼의 값과 행 집합의 수 사이가 될 것입니다.

3. Cost

비용은 사용된 자원이나 작업의 단위로 나타납니다. CBO는 작업의 단위로써 disk I/O, CPU 사용, 메모리 사용을 사용합니다. 그래서, CBO에서 사용되는 비용은 연산을 수행하는데 사용되는 디스크 I/O의 수, CPU의 총량, 사용된 메모리의 추정된 값을 보여줍니다. 연산은 인덱스를 사용하여 테이블의 행들에 접근하거나, 두 테이블을 조인하거나, 행 집합을 정렬하는 등과 같은 방법으로 테이블에 접근할 수 있습니다. 쿼리 계획의 비용은 쿼리가 수행되고 결과를 생산할 때 초래되는 것을 예상하는 작업 유닛의 수입니다.
 
접근 경로는 기본 테이블로부터 데이터를 가져오는데 요구되는 작업 유닛의 수를 결정합니다. 접근 경로는 테이블 스캔이나 fast full 인덱스 스캔, 범위 인덱스 스캔일 수 있습니다.
테이블 스캔이나 fast full 인덱스 스캔은 여러 블록들이 한번의 I/O 연산에 의해 디스크로부터 읽어옵니다.
그러므로, 이것들의 비용은 스캔될 블록의 수와 multiblock_read_count 값에 따라 달라지게 됩니다. 인덱스 스캔의 경우에는 B-tree의 레벨과 스캔될 leaf블록의 수, 인덱스 키의 rowid를 사용하여 페치될 행의 수에 따라서도 달라집니다. 행들을 페치하는 비용은 인덱스 클러스터링 팩터에 의존적입니다.
 
클러스터링 팩터가 인덱스의 속성이더라도, 클러스터링 팩터는 실제로 테이블의 데이터블록안에 유사한 인덱스된 컬럼 값의 분산도에 관계됩니다. 낮은 클러스터링 팩터는 개개 행들이 테이블에 더 적은 블록에 모여있다는 것을 나타냅니다. 반대로, 높은 클러스터링 팩터는 개개 행들은 그 테이블에 랜덤하게 블록들에 흩어져 있다는 것을 나타냅니다. 그러므로, 높은 클러스터링 팩터는 rowid에 의해 행들을 뽑아낼 때 범위 스캔을 하는 것은 더 많은 비용이 들 것이라는 것을 나타냅니다. 테이블에 더 많은 블록이 데이터를 반환하는데 필요하기 때문입니다.
 
조인 비용은 조인되고 있는 두 행 집합의 각각의 비용의 합산입니다.
조인에서 하나의 행 집합은 inner로 불려지고, 다른것은 outer로 불려집니다.
 
Nested loop join에서
outer 행 집합에 모든 행에 대해, inner 행 집합은 조인하는 일치하는 행들을 찾기 위해 접근됩니다. 그러므로, inner 행 집합은 outer 행 집합의 갯수 만큼 여러번 접근됩니다.

cost = outer access cost + ( inner access cost * outer cardinality )

Sort merge join에서
두 행 집합이 키 순서대로 이미 정렬되지 않았다면, 조인 키에 의해 정렬되어져야 합니다.

cost = outer access cost + inner access cost + sort costs

Hash join에서
inner 행 집합은 메모리에 해싱됩니다. 그리고, 해시 테이블이 조인 키와 함께 만들어 집니다. Outer 행 집합으로부터의 각각의 행은 해시되고, 해시 테이블은 모든 매칭하는 행들을 조인으로써 입증합니다. Inner 행 집합이 매우 크다면, 그것의 일부분만이 해시 될 것입니다. 이것은 해시 파티션 이라고 부릅니다.

cost = ( outer access cost * # of hash partitions ) + inner access cost


예제

CC BY-NC-ND 2.0 KR

이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용할 수 있습니다. 크리에이티브 커먼즈 라이선스

저작권과 관련된 파일요청 및 작업요청을 받지 않습니다.

댓글 남기기