열 기반 스토리지 - Amazon Redshift

열 기반 스토리지

데이터베이스 테이블에 대한 열 기반 스토리지는 전체 디스크 I/O 요구 사항을 크게 줄이기 때문에 분석 쿼리 성능을 최적화하는 데 중요한 요소입니다. 그러면 디스크에서 로드해야 하는 데이터의 양이 줄어듭니다.

아래 이어지는 그림들은 열 기반 데이터 스토리지가 어떻게 효율성을 구현하는지, 그리고 이를 통해 데이터를 메모리에 가져올 때 어떻게 효율성이 실현되는지 보여줍니다.

첫 번째 그림은 데이터베이스 테이블의 레코드가 디스크 블록에 행으로 저장되는 일반적인 방식을 나타낸 것입니다.

일반적인 관계형 데이터베이스 테이블에서는 각 행마다 단일 레코드의 필드 값이 포함됩니다. 행 방향 데이터베이스 스토리지에서는 데이터 블록이 연속되는 열마다 순차적으로 값을 저장하여 전체 행을 구성합니다. 이때 블록 크기가 레코드 크기보다 작으면 전체 레코드를 저장하는 스토리지에 블록이 1개 이상 필요할 수도 있습니다. 블록 크기가 레코드 크기보다 크면 전체 레코드를 저장하는 스토리지에 필요한 블록이 1개 미만일 수 있으므로, 디스크 공간을 비효율적으로 사용하는 결과가 발생합니다. 온라인 트랜잭션 처리(OLTP) 애플리케이션일 때는 대부분 트랜잭션에서 전체 레코드의 모드 값을 읽고 쓰는 작업이 자주 일어납니다(일반적으로 한 번에 1개 또는 소수의 레코드). 결과적으로 OLTP 데이터베이스에서는 행 방향 스토리지가 가장 효과적입니다.

다음 그림은 열 기반 스토리지일 때 각 열 값이 디스크 블록에 순차적으로 저장되는 방식을 나타낸 것입니다.

열 기반 스토리지를 사용할 때는 각 데이터 블록이 여러 행에 대한 단일 열 값을 저장합니다. 레코드가 시스템에 들어가면 Amazon Redshift는 데이터를 각 열의 컬럼 스토리지로 투명하게 변환합니다.

위의 간단한 예에서는 열 기반 스토리지를 사용하기 때문에 데이터 블록에 저장되는 열 필드 값이 행 방향 스토리지에 저장되는 레코드 수보다 3배 더 많습니다. 다시 말해 레코드 수가 동일하다고 가정할 때 동일한 수의 열 필드 값을 읽어오는 데 필요한 I/O 작업이 행 방향 스토리지에 비해 1/3로 줄어듭니다. 실제로 열과 행의 수가 매우 많은 테이블을 사용하면 스토리지 효율성이 더욱 커집니다.

각 블록은 동일한 형식의 데이터를 보유하므로 블록 데이터는 열 데이터 형식에 맞게 선택된 압축 스키마를 사용하여 디스크 공간 및 I/O를 추가로 줄일 수 있다는 이점이 있습니다. 데이터 형식에 기반한 압축 인코딩에 대한 자세한 내용은 압축 인코딩 섹션을 참조하세요.

데이터를 디스크에 저장하기 위한 공간을 절약하면 데이터를 가져와서 메모리에 저장하는 작업에도 영향을 미칩니다. 대다수 데이터베이스 작업이 한 번에 1개 또는 소수의 열에서만 액세스하거나 실행되기 때문에 실제로 쿼리에 필요한 열 블록을 가져오는 것만으로도 메모리 공간을 절약할 수 있습니다. OLTP 트랜잭션에서 레코드 수가 적을 때 일반적으로 행 하나에 대부분 또는 모든 열이 포함될 경우, 행의 수가 매우 많을 때도 데이터 웨어하우스 쿼리는 일반적으로 몇 개의 열만 읽습니다. 이는 동일한 수의 행에 대해 동일한 수의 열 필드 값을 읽으려면 I/O 작업의 일부가 필요함을 의미합니다. 행 방향 블록을 처리하는 데 필요한 메모리의 일부만 사용합니다. 실제로 열과 행의 수가 매우 많은 테이블을 사용하면 효율성의 이점도 비례하여 커집니다. 예를 들어 테이블에 100개의 열이 있다고 가정하겠습니다. 이때 열을 5개 사용하는 쿼리는 테이블에 포함된 데이터 중에서 약 5%만 읽어오면 됩니다. 이러한 절약 효과는 대용량 데이터베이스의 레코드 수가 10억 개든, 혹은 심지어 1억 개든 반복됩니다. 이와 대조적으로 행 방향 데이터베이스는 불필요한 열 95개가 포함된 블록까지 읽어옵니다.

일반적인 데이터베이스 블록 크기 범위는 2~32KB입니다. Amazon Redshift는 1MB의 블록 크기를 사용하므로 데이터베이스 로드 또는 쿼리 실행의 일부인 다른 작업을 수행하는 데 필요한 I/O 요청의 수를 줄이고 더욱 효율적입니다.