OPTIMIZE FINAL은 디스크에 저장된 데이터를 물리적으로, 그리고 영구적으로 재구성하고
최적화하는 DDL 명령입니다. 이 명령은 MergeTree 테이블의 데이터 파트를 물리적으로 머지하고,
그 과정에서 저장소의 중복 행을 제거하여 데이터 중복 제거를 수행합니다.
FINAL은 저장된 데이터의 구조를 변경하지 않으면서 중복 제거된 결과를 제공하는
쿼리 시점 수정자입니다. 읽기 시점에 머지 로직을 수행하는 방식으로 동작합니다.
이는 일시적이며 현재 쿼리 결과에만 영향을 줍니다.
OPTIMIZE FINAL은 성능 오버헤드가 크므로 사용을 피하라는 권고를 받는 경우가 많지만,
이 둘을 혼동해서는 안 됩니다. 특히 ReplacingMergeTree와 같은 테이블
엔진을 사용할 때는 중복 없는 결과를 얻기 위해 FINAL을 사용해야 하는 경우가 많습니다. 이러한 엔진에는
최종적으로 수행되는 백그라운드 머지 과정에서 아직 대체되지 않은 중복 행이 남아 있을 수 있기 때문입니다.
아래 표는 주요 차이점을 요약합니다:
| Aspect | OPTIMIZE FINAL | FINAL |
|---|---|---|
| 유형 | DDL 명령 | 쿼리 수정자 |
| 효과 | 영구적인 저장소 최적화 | 일시적인 쿼리 시점 중복 제거 |
| 성능 | 비용이 한 번 크게 들지만 이후 쿼리는 더 빨라짐 | 개별 비용은 더 낮지만 각 쿼리마다 반복됨 |
| 데이터 수정 | 예 - 저장소를 물리적으로 변경함 | 아니요 - 읽기 전용 작업 |
| 사용 사례 | 주기적인 유지 관리/최적화 | 실시간 중복 제거 쿼리 |
각각을 언제 사용해야 하는지
OPTIMIZE FINAL을 사용하십시오:
- 쿼리 성능을 영구적으로 개선하려는 경우
- 일회성 최적화 비용을 감수할 수 있는 경우
- 테이블(table) 유지 관리를 주기적으로 수행하는 경우
- 중복 데이터를 물리적으로 정리하려는 경우
FINAL을 사용하십시오:
- 중복 제거된 결과가 즉시 필요한 경우
- 영구적인 최적화를 기다릴 수 없거나 원하지 않는 경우
- 중복 제거된 데이터가 가끔만 필요한 경우
- 자주 변경되는 데이터를 다루는 경우