CBO와 히스토그램 정리

◆ CBO와 히스토그램 정리


 - 기본적으로 옵티마이저는 컬럼값 안에 최소값과 최대값 사이의 값이 균등하게 분포되고, 모든 값은 같은 수만큼 존재 한다고 가정한다. 그러므로 실제 값이 편중되어 있을 때 잘못된 액세스 패스를 선택 할 수 도 있다. 


 - 옵티마이저 통계를 수집할 때 컬럼값 히스토그램을 생성하는 것으로 올바른 액세스 패스를 선택할 가능성을 높일 수 있다. 


 - NDV가 적을 경우 빈도 분포 히스토그램을 만들면 정확한 선택도를 계산 할 수 있다.


 - NDV가 많을 경우에도 높이 균형 히스토 그램을 만들수 있다. 정확성은 분도 빈포 히스토그램보다 떨어지지만, 적절한 액세스 패스를 선택하기 위한 정보는 충분히 얻을 수 있다.



 1) 빈도 분포 히스토그램 (Frequency)


 - 오라클에서는 최대 254개의 버킷을 지정하여 컬럼값 히스토그램을 생성 할 수 있음.

 - 지정한 버킷 수 이하라면 '빈도 분포' 히스토그램이 만들어진다.

 - 빈도분포 히스토그램은 각 값이 몇 건이나 있는지 정확하게 기록 한다.

 - 256 종류 이상 (패킷0을 포함한 255 종류의 값이 기록 가능)의 값을 가진 컬럼에는 생성 불가능.

 - 버킷을 제한 없이 늘리면 히스토그램 생성 시간이 길어지고, 히스토그램 정보가 들어있는 딕셔너리 테이블도 대량으로 소비하게 된다. 



 2) 높이 균형 히스토그램 (Height Balanced)


 - 빈도분포 만큼 정확하지는 않지만, 편중된 값을 검출하기 위해 사용.

 - 정렬한 데이터를 지정한 버킷 수로 순서에 따라 균등하게 입력해 나가며, 각 버킷 마지막 값(ENDPOINT_VALUE)을 기록. 각 버킷에 같은 건수만 들어간다. 여러 버킷의 ENDPOINT_VALUE가 같다면, 이 값이 다른 값들보다 많이 존대 한다는 증거. 이렇게 여러 버킷의 ENDPOINT_VALUE가 되는 값을 '포뮬러값' 이라고 한다.

 - 같은 포뮬러값이 존재 하는 경우, 마지막 버킷 정보만 보관하고, 같은 포뮬러값의 이전 버킷의 정보는 생략.

 - 버킷 0은 특수한 버킷으로 최소값을 나타냄.

 - 마지막 ENDPOINT_VALUE 값은 최대값을 나타냄.

 - 포뮬러값이 존재하는경우 ENDPOINT_NUMBER의 값이 누락 된다. 



 ※ 히스토그램을 사용할 때 주의점


 1) 높이 균형 히스토그램의 경우 '=' 조건으로 포뮬러값 이외의 치우침은 찾아낼 수 없다. 포뮬러값을 찾아내기 위해서는 적절한 사이즈의 버킷수가 필요.


 2) NDV가 적으나 다른 값에 비해 수가 더욱 적은 임의의 값을 검색할 때, 인덱스 액세스를 선택하도록 하고 싶을 경우에는 빈도 분포 히스토그램이 필요.


 3) 문자형 데이터의 경우에는 히스토그램에 칼럼값으로 보관되는 것은 32 Byte까지이며, 첫 글자부터 동일 하게 32 Byte (한글은 16글자) 라면 히스토그램상에서는 같은 값으로 취급한다. 



'ORACLE > Tunning' 카테고리의 다른 글

CURSOR_SHARING  (0) 2018.10.31
CBO 와 바인드 변수, 바인드 피크  (0) 2018.05.17
Hint 정리  (0) 2017.12.18
CBO와 히스토그램 정리  (0) 2017.12.07
옵티마이저 기본기능  (0) 2017.11.14

티스토리 툴바