6. 정리
옵티마이저는 표의 행 수와 블록 수, 컬럼의 고유 값 수와 NULL 수와 최소·최대, 히스토그램으로 조건별 예상 행 수를 계산합니다. 히스토그램이 없으면 값이 고르게 퍼졌다고 가정하고, 치우친 컬럼에서는 이 가정이 크게 틀립니다.
통계 수집은 Oracle 의 DBMS_STATS.GATHER_TABLE_STATS, MySQL 의 ANALYZE TABLE, MSSQL 의 UPDATE STATISTICS 입니다. 자동 수집이 있어도 대량 적재 직후에는 통계가 낡아 있기 쉬워 배치 끝에 수집을 넣습니다.
바인드 변수와 치우친 분포가 만나면 첫 실행 값의 계획이 굳습니다. 힌트는 계획을 고정하지만 데이터가 바뀌면 오히려 독이 되므로, 통계를 먼저 고치고 힌트는 마지막 수단으로 씁니다. Oracle 힌트는 틀려도 오류가 나지 않아 계획으로 적용 여부를 꼭 확인합니다.
다음 레슨은 파티션입니다. 큰 표를 나눠 필요한 조각만 읽는 프루닝을 다룹니다.