717~723

pιdistribute 힌트

병렬 조인을 수행 할 때 사용자가 조인을 위한 데이터 분배 방식을 결정 가능

/*\+ PQ_DISTRIBUTE( table, outer_distribution, inner_distribution ) \*/

pqdistribute(inner, none, none)
Full-Partition Wise 조인으로 유도할 때 사용한다. 당연히 양쪽 태이블 모두 조인 컬럼에 대
해 같은 기준으로 파티셔닝 (equi-partitioning) 돼 있을 때만 작동한다.

pq_distribute(inner, partition, none)
Partial-Partition Wise 조인으로 유도할 때 사용하며 outer 테이블을 mner 테이블 파티션
기준에 따라 파티셔닝하라는 돗이다. 당연히 inner 테이블이 조인 카 컬럼에 대해 파티셔닝 돼
있을때만작동한다.

pq_distribute(inner, none, partition)
Partial-Partition Wise 조인으로 유도할 때 사용하며 mner 테이블을 outer 테이블 파티션
기준에 따라 파티셔닝하라는 뭇이다. 당연히, outer 테이블이 조인 커 컬럼에 대해 파티셔닝 돼
있을때만작동한다.

pq_distribute(inner, hash, hash)
조인 키 컬럼을 해시 함수에 적용하고 거기서 반환된 값을 기준으로 양쪽 테이블을 동적으로 파
티셔닝하라는뭇이다.

pq_distribute(inner, broadcast, none)
outer 테이블을 Broadcast 하라는 뜻이다.

pq_distribute(inner, none, broadcast)
inner 테이블을 Broadcast 하라는 뜻이다.

이하는 책에 없는 개인적인 조사를 통한 정리글입니다.

왜? PQ_DISTRIBUTE 힌트를 쓰는가?
옵티마이저가 합당한 분배법칙을 따르지 않기 때문
왜? 옵티마이저가 합당하지 않은 분배법칙으로 병렬 처리를 할까?
통계정보가 제대로 안잡혔겟지?
통계정보는 왜 제대로 안잡힐까?
수집 시간이 오래걸려서.

■통계수집 시간 이슈

dbms_stats.gather_schema_stats 프로시저를 이용해서 통계 정보를 수집하는 경우 수행 시간이 너무 많이 걸린다는 불만이 종종 있다.
이런 현상은 대부분 다음과 같은 경우에 발생한다.

  • 특정 테이블들의 크기가 매우 크다.
  • 일부 큰 테이블들은 Partitioning이 되어 있다.

■ 요약

1.유저별 테이블 사이즈 조사
2.큰 테이블 제외하고 통계 수집
3.큰 테이블 제외 해제
4.큰 테이블만 따로 통계수집

1. 11g NF

■소유자(SCOTT)별 테이블 크기 조사
SELECT A.SEGMENT_NAME,
ROUND(SUM(A.BYTES)/1024/1024) "SIZE_MB",
A.SEGMENT_TYPE
FROM DBA_SEGMENTS A,
DBA_TABLES B
WHERE A.SEGMENT_NAME = B.TABLE_NAME
AND A.SEGMENT_TYPE IN ('TABLE','TABLE PARTITION')
AND A.OWNER = 'SCOTT'
GROUP BY A.SEGMENT_NAME, A.SEGMENT_TYPE
ORDER BY 2 DESC;

■예시
SEGMENT_NAME SIZE_MB SEGMENT_TYPE
\





















\- \

-\- \



-\-
X2 568 TABLE
X1 563 TABLE
EMP 0 TABLE
E1 0 TABLE
E2 0 TABLE
DEPT 0 TABLE
T3 0 TABLE
INDENT2 0 TABLE
JAVA$OPTIONS 0 TABLE
SALGRADE 0 TABLE
D2 0 TABLE
FRUIT2 0 TABLE
T1 0 TABLE
T2 0 TABLE
CUSTOMER2 0 TABLE
CREATE$JAVA$LOB$TABLE 0 TABLE

16 개의 행이 선택되었습니다.


\- 특정 테이블 통계 정보 변경을 막음 (SCOTT 소유 X1 테이블)

exec dbms_stats.lock_table_stats('SCOTT', 'X1');

\- 스키마 레벨로 통계 정보 수집
exec dbms_stats.gather_schema_stats('SCOTT');

\- 통계 정보 활성화 후 이 테이블만 다시 통계 정보 수집
exec dbms_stats.unlock_table_stats('SCOTT', 'X1');
exec dbms_stats.unlock_table_stats('SCOTT', 'X2');
exec dbms_stats.gather_table_stats('SCOTT','X1', estimate_percent=>10, method_opt=>'FOR ALL INDEXED COLUMNS SIZE AUTO');
exec dbms_stats.gather_table_stats('SCOTT','X2', estimate_percent=>10, method_opt=>'FOR ALL INDEXED COLUMNS SIZE AUTO');

■11g NF
exec dbms_stats.set_table_prefs('SCOTT','X1', 'ESTIMATE_PERCENT', '10');
exec dbms_stats.set_table_prefs('SCOTT','X1','METHOD_OPT', 'FOR ALL INDEXED COLUMNS SIZE AUTO');

exec dbms_stats.gather_schema_stats('SCOTT');