히스토그램 유형

 - 오라클이 사용하는 히스토그램 

     ● 높이균형 히스토그램 

     ● 도수분포 히스토그램

 - 히스토그램을 생성하려면 컬럼 통계 수집 시 버킷 개수를 2 이상으로 지정하면 된다. 

 - 히스토그램 정보는 dba_histograms 또는 dba_tab_histograms 뷰를 통해 확인할 수 있다. 

    특히, 10g에서는 dba_tab_columns 뷰에 histogram 컬럼이 추가되면서 히스토그램 유형을 

    쉽게 파악할 수 있게 되었다. 

     ● FREQUENCY : 도수 분포 히스토그램 

     ● HEIGHT-BALANCED : 높이균형 히스토그램 

     ● NON : 히스토그램 생성하지 않음  


도수분포 히스토그램 

 - 도수분포 히스토그램은 컬럼 값마다 하나의 버킷을 할당한다. 사용자가 요청한 버킷 개수가 

   컬럼이 가진 값의 수보다 많거나 같을 때 사용되며, 최대 254개의 버킷만 허용하므로 

   값의 수가 254를 넘는 컬럼에는 이 히스토그램을 사용할 수 없다. 

 - 254개를 요청하더라도 값의 수만큼만 버킷을 할당하므로 정확한 히스토그램을 위해서라면 

   항상 254개를 요청하는 것이 좋다. 

 - 히스토그램 정보를 조회할 수 있는 뷰에는 아래 두 컬럼이 있다. 

     ● endpoint_value  : 버킷에 할당된 컬럼 값 

     ● endpoint_number : endpoint_value로 정렬했을 때, 최소 값부터 현재 값까지의 누적 수량


높이균형 히스토그램 

 - 높이균형 히스토그램에서는 버킷 개수보다 값의 수가 많기 때문에 하나의 버킷이 여러 개 

   값을 담당한다. 

 - 요청할 수 있는 최대 버킷 개수는 254개이므로 값의 수가 254개를 넘으면 무조건 히스토그램이 

   만들어진다.  (컬럼수보다 버킷을 적게 적어주어도 높이균형 히스토그램이 생성된다.)

 - 높이균형 히스토그램에서는 말 그대로 각 버킷의 높이가 같다. 각 버킷은 {1/(버킷 개수) x100}%

   의 데이터 분포를 갖는다. 

 - 빈도 수가 많은 값을 포함할 때는 두 개 이상의 버킷이 할당된다.  

 - 오라클은 popular value에 대한 카디널리티를 구할 때만 버킷에 의한 계산식을 사용하고 

   나머지는 미리 구해 놓은 density 값을 이용한다. 

 - popular value에 대한 선택도/카디널리티 계산 

     ● 조건절 값이 두 개 이상 버킷을 가진 popular value이면 아래 공식을 따른다. 

         선택도 = (조건절 값의 버킷 개수) / (총 버킷 개수)

 - non-popular value에 대한 선택도/카디널리티 계산 

     ● 카디널리티 = 총 로우 수 x 선택도 = 총 로우 수 x density

 - 바인드 변수 사용 시 카디널리티 계산 

     ● 바인드 변수 사용시 변수 값 입력이 나중에 되니 실행계획에서 카디널리티를 계산할 수가 

         없다. 그래서 컬럼 분포가 균일할 때는 문제될 것이 없지만 그렇지 않을 때는 실행 시점에 

         바인딩되는 값에 따라 최적이 아닌 실행계획일 수 있어 문제다. 

     ● 바인드 변수를 사용하면 정확한 컬럼 히스토그램에 근건하지 않고 카디널리티를 구하는 

         정해진 계산식에 기초해 비용을 계산하므로 최적이 아닌 실행계획을 수립할 가능성이 

         커진다.

     ● 좋은 실행계획을 위해서라면 DW, OLAP, 배치 프로그램에서 수행되는 쿼리는 

         바인드 변수보다 상수를 사용하는 것이 좋고, 날짜 컬럼처럼 부등호, between 같은 

         범위 조건으로 자주 검색되는 컬럼일 때 특히 그렇다.

     ● OLTP성 쿼리이더라도 값의 종류가 적고 분포가 균일하지 않을 때는 상수 조건을 쓰는 것이 

         유용할 수 있다.    


결합 선택도 

 - 동적 샘플링은 소량의 데이터 샘플링을 통해 where 조건절에 사용된 두개 이상 컬럼의 결합 

   분포를 구하는 기능으로서, 동적 샘플링 레벨을 4 이상으로 설정할 때만 작동한다. 

    ( 힌트 사용 시 /*+ dynamic_sampling(4) */ 이렇게 사용 

 - 다중 컬럼 통계 11g에서는 다중 컬럼에 대한 히스토그램도 생성할 수 있게 되었다. 

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

성능고도화 3-8. 통계정보2  (0) 2016.12.26
성능고도화 3-7. 비용  (0) 2016.12.26
성능고도화 3-5. 카디널리티  (0) 2016.12.26
성능고도화 3-4. 통계정보1  (0) 2016.12.26
성능고도화 3-3. 옵티마이저의 한계  (0) 2016.12.26

+ Recent posts