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 프로시저를 이용해서 통계 정보를 수집하는 경우 수행 시간이 너무 많이 걸린다는 불만이 종종 있다.
이런 현상은 대부분 다음과 같은 경우에 발생한다.
■ 요약
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
\
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');