데이터 큐브 계산을 위한 주요 최적화 기법
데이터 웨어하우스와 OLAP 환경에서 데이터 큐브(data cube)를 효율적으로 계산하려면 대규모 데이터셋을 처리하기 위한 최적화 기술이 반드시 필요합니다. 아래에서는 데이터 큐브 연산의 성능을 크게 향상시키는 대표적인 기법 네 가지를 살펴봅니다.
1. 정렬, 해싱, 그룹화(Sorting, Hashing, Grouping)
차원 속성에 정렬, 해싱, 그룹화 연산을 적용하면 관련된 튜플(tuple)을 재배열하고 클러스터링할 수 있습니다. 큐브 계산에서 집계(aggregation)는 동일한 차원 값 집합을 공유하는 튜플들에 대해 수행되므로, 해당 데이터에 접근하고 그룹화하기 위해 정렬·해싱·그룹화 기능을 활용하는 것이 매우 중요합니다.
예를 들어 지점(branch), 일자(day), 상품(item)별 총 판매액을 계산한다고 가정해 보겠습니다. 이 경우 튜플이나 셀(cell)을 지점 기준으로 먼저 정렬하고, 그다음 일자 기준으로 정렬한 뒤 상품명으로 그룹화하는 것이 더 효과적입니다. 대용량 데이터셋에서 이러한 연산의 성능은 데이터베이스 연구 분야에서 오랫동안 폭넓게 연구되어 왔습니다.
이러한 성능 개선 기법은 데이터 큐브 계산에도 그대로 확장 적용할 수 있습니다. 정렬 기반 기법을 사용할 때는 여러 큐보이드(cuboid) 간에 정렬 비용을 공유하는 공유 정렬(shared-sorts)을, 해시 기반 알고리즘을 사용할 때는 파티셔닝 비용을 공유하는 공유 파티셔닝(shared-partitions)을 구현함으로써 전체 연산 비용을 절감할 수 있습니다.
2. 중간 결과의 동시 집계 및 캐싱
큐브 계산 시에는 기본 사실 테이블(base fact table)에서 직접 집계하는 것보다, 이미 계산된 하위 수준의 집계 결과로부터 상위 수준의 집계를 도출하는 것이 효율적입니다. 또한 캐시된 중간 계산 결과를 활용해 동시에 집계를 수행하면 비용이 많이 드는 디스크 입출력(I/O) 연산을 크게 줄일 수 있습니다.
예를 들어 지점별 판매액을 계산할 때, '지점-일자' 단위의 하위 큐보이드 계산 과정에서 얻은 중간 결과를 재활용할 수 있습니다. 이 방식은 가능한 한 많은 큐보이드를 동시에 계산하여 디스크 읽기 비용을 분산하는 상각 스캔(amortized scans) 구현으로도 확장됩니다.
3. 여러 자식 큐보이드가 존재할 때 가장 작은 자식으로부터 집계
하나의 부모(더 일반화된) 큐보이드를 계산할 때 후보가 되는 자식 큐보이드가 여러 개라면, 일반적으로 가장 작은, 즉 데이터 규모가 가장 작은 자식 큐보이드로부터 집계하는 것이 가장 효율적입니다. 입력 데이터가 적을수록 연산량과 I/O 비용이 함께 줄어들기 때문입니다.
4. 아이스버그 큐브 계산을 위한 Apriori 가지치기
데이터 큐브의 맥락에서 Apriori(아프리오리) 속성은 다음과 같이 정의됩니다. 어떤 셀이 최소 지지도(minimum support)를 만족하지 못한다면, 그 셀의 모든 후손(descendant), 즉 더 세분화된 셀 역시 최소 지지도를 만족하지 못합니다. 이 속성을 활용하면 아이스버그 큐브(iceberg cube)의 계산량을 획기적으로 줄일 수 있습니다.
아이스버그 큐브의 정의에는 구체화(materialization)할 셀에 대한 제약 조건인 아이스버그 조건이 포함됩니다. 일반적인 아이스버그 조건은 셀이 최소 개수(count)나 최소 합계(sum) 같은 최소 지지도 임계값을 충족해야 한다는 것입니다. 이러한 관점에서 Apriori 속성을 적용하면 해당 셀의 후손들을 검사하는 과정을 생략하는 가지치기(pruning)가 가능해집니다.
마무리
위에서 소개한 네 가지 기법은 단독으로 사용할 수도 있지만, 실제 OLAP 시스템에서는 서로 결합하여 적용할 때 더욱 큰 성능 향상을 얻을 수 있습니다. 정렬·해싱·그룹화로 데이터 접근을 최적화하고, 캐싱과 상각 스캔으로 I/O 비용을 줄이며, Apriori 가지치기로 불필요한 연산을 제거하면 대규모 데이터 큐브도 실용적인 시간 안에 계산할 수 있습니다.