본문 바로가기

카테고리 없음

데이터분포도 조사하기



 데이터 분포도를 조사하자.

해당 쿼리가 사용하는 테이블의 스키마 정보들을 파악했다면,

이제 테이블의 데이터 분포도를 파악해야한다.


이 단계에서 해야하는 조사작업은 다음과 같다.

  1. 조건절에서 어떤 칼럼을 사용했나?
  2. 조건절 칼럼에서 어떤 연산자를 사용했나?
  3. 조건절 칼럼들의 데이터분포 상황은 어떠한가?



 어떤 컬럼에 어떤 연산자를 사용했는지가 왜 중요한가?

사용된 연산자의 종류는 인덱스 효율에 큰 영향을 미친다.


예를 들자면, 인덱스 스캔 시작점 결정원리에 의하여

LIKE 연산자는 BETWEEN 연산자보다 항상 같거나 불리하고.


단일 컬럼으로 구성된 인덱스는 NULL 값이 입력되지 않기 때문에

IS NULL 연산자는 단일 인덱스의 활용이 아예 불가능하다.


이런 사례들이 상당히 많기 때문에 

어떤 연산자를 쓰는지 또한 중요한 정보이다.



 어떤 컬럼, 어떤 연산자를 사용했나?

일단, 조건절에서 사용된 칼럼의 이름과 어떤 연산자를 사용했는지 파악해야 한다.

이것은 타겟쿼리를 직접 보면서 파악해야 한다.


-- 특정 사용자가 소유하고, -- 클러스터링 되지 않은 테이블 목록 출력 SELECT * FROM ALL_TABLES T WHERE T.OWNER = '#OWNER_NAME' AND T.CLUSTER_NAME is IS NULL;


예를 들어 위와 같은 쿼리가 있다고 가정하자면.


조건절에서 사용된 컬럼은 2개(OWNER, CLUSTER_NAME)이고,

각각 적용된 연산자는 EQUAL과 IS NULL 연산자이다.



 데이터분포도 조사가 왜 중요한가?

데이터 분포도는 옵티마이저가 실행계획 생성 시 참고하는 자료이며

쿼리 비용산정 시 거의 직접적으로 참고되는 값이므로

옵티마이저의 행동에 매우 큰 영향을 끼친다.


예를 들어서 1000만건의 BIG 테이블과, 50만건의 SMALL 테이블이 있을 때,

다음과 같은 쿼리를 사용한다고 가정하자.


SELECT *
FROM   BIG, SMALL
WHERE  BIG.gender = 'F'
AND    BIG.job    = SMALL.job;


위 두개의 테이블을 NL조인으로 처리할 때,

어떤 테이블을 드라이빙 하는 것이 성능상 유리한지 생각해보자.


기본적으로 NL조인은 작은 크기의 테이블을 드라이빙 하는 것이 유리하다.

하지만 위처럼 BIG 테이블이 gender 조건으로 필터링 되었을 경우에는 어떨까.


그 결과가 SMALL 테이블보다 작다면 

오히려 BIG 테이블을 드라이빙 하는것이 유리하다.


물론 기본적인 데이터분포도 조사도 DBMS가 자동으로 실시하고 있지만,

기술적인 문제때문에 DBMS에게 전부 맡기지는 못한다.



 분석함수를 날리자.

그렇다면 어떻게 데이터 분포도를 조사할 것인가?

DBMS가 조사한 히스토그램을 분석하거나, 수동으로 통계쿼리를 날리면 된다.


아래는 통계쿼리를 날려서 owner 기준으로 

ALL_TABLES의 데이터 분포도를 조사하는 쿼리이다.


-- owner 기준으로 ALL_TABLES의 데이터 건수 조사
SELECT T.owner, count(*)
FROM   ALL_TABLES T
GROUP BY T.owner;


위의 쿼리를 실행한 실제 결과는 아래와 같다.

페이지 간소화를 위해 일부 로우를 삭제했다.


OWNER                            COUNT(*)

------------------------------ ----------

MDSYS                                 120

CTXSYS                                 47

OWBSYS                                  1

HR                                      7

SYSTEM                                156

APEX_030200                           360

SYSMAN                                728

SYS                                   956

...


24 rows selected.