Storage Data Map
본 장에서는 ZetaData의 주요 기능인 스토리지 데이터 맵(Storage Data Map)에 대해 설명합니다.
개요
스토리지 데이터 맵(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 절과 완전히 같을 필요는 없습니다. 사용하는 컬럼만 동일하다면 조회 성능은 향상됩니다.

스토리지 데이터 맵은 디스크의 각 영역에 대한 컬럼들의 최댓값과 최솟값을 포함하는데, WHERE 절의 조건이 최대, 최소의 범위를 벗어나는 경우 해당 디스크 영역에 대한 읽기 작업을 수행하지 않을 수 있습니다.
따라서 조회 쿼리의 선택도(selectivity)가 낮을수록 다시 말해 조건을 만족하는 데이터의 수가 적을수록 성능 향상의 폭이 큽니다. 마찬가지로 WHERE 절에 사용되는 컬럼에 대해 정렬된 형태로 데이터를 저장할 경우 컬럼의 최댓값과 최솟값의 차이가 작아지기 때문에 스토리지 데이터 맵의 효과를 극대화할 수 있습니다.
생성된 스토리지 데이터 맵은 해당 영역에 대한 쓰기 요청을 수행하는 즉시 메모리에서 제거됩니다. 데이터가 변경될 경우 기존에 계산한 통계값이 달라질 수 있기 때문입니다. 따라서 데이터의 변경이 많은 OLTP 시스템에서는 스토리지 데이터 맵의 사용은 권장하지 않습니다.
Function Offloading이 켜져있을 때 스토리지 데이터 맵이 동작하므로, 이 경우 Function Offloading 초기 화 파라미터를 이용해 Function Offloading 기능을 비활성화 합니다.
Last updated