> For the complete documentation index, see [llms.txt](https://docs.tibero.com/zetadata/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/zetadata/storage-data-map.md).

# Storage Data Map

본 장에서는 ZetaData의 주요 기능인 스토리지 데이터 맵(Storage Data Map)에 대해 설명합니다.

## 개요 <a href="#bookmark135" id="bookmark135"></a>

스토리지 데이터 맵(Storage Data Map) 기능은 수행해야 하는 디스크 읽기 양을 줄여 디스크 대역폭을 효율적으로 사용할 수 있는 기술입니다.

ZetaData는 한 번 읽은 디스크 영역에 대해 각 컬럼의 최댓값과 최솟값 등의 통계값을 자동으로 계산해 메모리에 유지함으로써, 필터링 조건을 만족하는 데이터가 없는 디스크 영역에 대해 읽기 작업을 수행하지 않도록 할 수 있습니다. 실제로 수행하는 디스크 읽기 작업의 양이 줄어들기 때문에 디스크 대역폭을 보다 효율적으로 사용할 수 있을 뿐만 아니라 디스크 I/O에 소모되는 시간을 크게 줄일 수 있습니다.

***

## 동작 방식

Table Full Scan 형태로 데이터를 조회하면 물리적으로 연속된 디스크 영역을 읽습니다. 이때 SSVR 인스턴스는 해당 디스크 영역의 각 컬럼에 대한 최댓값과 최솟값을 계산해 스토리지 데이터 맵을 구성합니다. 인덱스를 이용한 테이블 조회처럼 특정 디스크 블록만 읽는 경우에는 연속된 디스크 영역 전체를 읽지 않으므로 스토리지 데이터 맵이 생성되지 않습니다. 따라서 Function Offloading과 마찬가지로 인덱스를 생성하지 않거나 쿼리 힌트를 사용해 Table Full Scan을 수행하는 것이 효과를 높이는 데 중요합니다.

스토리지 데이터 맵 생성 대상 컬럼은 테이블의 전체 컬럼 중 조회 쿼리의 WHERE 절에 포함된 컬럼으로 한정됩니다. 또한, 함수나 계산식 등으로 전처리하지 않은 컬럼만 대상이 됩니다.

지원되는 컬럼 타입에는 NUMBER, CHAR, VARCHAR와 별도 변환 없이 WHERE 절에 포함할 수 있는 대부분의 기본 타입이 포함됩니다. LOB 컬럼은 별도의 LOB 세그먼트에 저장됩니다. 따라서 LOB 컬럼이 포함된 경우에는 이 기능을 사용할 수 없습니다. LONG과 RAW 타입은 Function Offloading 기능이 동작하지 않으므로 SDM이 생성되지 않습니다. XML 타입도 같은 이유로 SDM 기능을 사용할 수 없습니다.

해당 컬럼을 WHERE 절에 사용할 때에는 "크다, 작다"와 같은 크기 비교뿐만 아니라 "같다, 다르다", "NULL이다, NULL이 아니다" 등의 조건을 사용할 수 있습니다. 대상 컬럼이 많은 경우에는 최대 8개 컬럼에 대해서만 스토리지 데이터 맵이 생성됩니다. 나머지 조회 컬럼은 무시됩니다.

SSVR 인스턴스를 기동한 후 처음 저장된 데이터를 조회할 때에는 생성된 스토리지 데이터 맵이 없습니다. 따라서 성능 향상 효과를 볼 수 없습니다. WHERE 절에서 같은 컬럼을 반복해 조회하면 조회 성능이 향상됩니다. 이때 사용하는 WHERE 절은 스토리지 데이터 맵 생성 시 사용한 WHERE 절과 완전히 같을 필요가 없습니다. 사용하는 컬럼만 같다면 조회 성능은 향상됩니다.

![그림 1. Storage Data Map 동작 방식](https://content.gitbook.com/content/C4CM2cGYECmozpu6EgSG/blobs/IlFtDHSiIyE4JTXZFRHe/5.png)

스토리지 데이터 맵은 디스크 각 영역의 컬럼별 최댓값과 최솟값을 포함합니다. WHERE 절 조건이 최댓값과 최솟값의 범위를 벗어나면 해당 디스크 영역을 읽지 않을 수 있습니다.

따라서 조회 쿼리의 선택도(selectivity)가 낮을수록, 다시 말해 조건을 만족하는 데이터가 적을수록 성능 향상 폭이 큽니다. 마찬가지로 WHERE 절에 사용되는 컬럼을 기준으로 데이터를 정렬해 저장하면 컬럼의 최댓값과 최솟값 차이가 작아집니다. 따라서 스토리지 데이터 맵의 효과를 극대화할 수 있습니다.

생성된 스토리지 데이터 맵은 해당 영역에 대한 쓰기 요청을 수행하는 즉시 메모리에서 제거됩니다.\
데이터가 변경될 경우 기존에 계산한 통계값이 달라질 수 있기 때문입니다. 따라서 데이터의 변경이 많은 OLTP 시스템에서는 스토리지 데이터 맵의 사용은 권장하지 않습니다.

스토리지 데이터 맵은 Function Offloading이 활성화되어 있을 때 동작합니다. 스토리지 데이터 맵을 비활성화하려면 Function Offloading 초기화 파라미터를 이용해 Function Offloading 기능을 비활성화합니다.

{% hint style="warning" %}
**주의**

SDM에 대한 공유 메모리 확보가 필요합니다.

자세한 내용은 “[초기화 파라미터](/zetadata/installation-configuration.md#bookmark37)”를 참고합니다.
{% endhint %}
