Amazon Web Services 한국 블로그

쿼리 실행의 속도를 높여 주는 Amazon Redshift 구체화 보기 기능 출시

Amazon Redshift에서는 테이블에서 질의한 보기(View)는 Amazon QuickSight 또는 Tableau 같은 BI(비즈니스 인텔리전스) 도구를 위해 사용할 수 있습니다. 다만,  사용 편의성과 유연성을 제공하지만 데이터 액세스의 속도를 높여 주지 않습니다.

성능이 중요한 경우, 데이터 엔지니어는 CTAS(create table as)를 사용합니다. CTAS는 질의에 의해 정의된 테이블입니다. 질의는 테이블 생성 시점에 실행되며 애플리케이션은 CTAS를 일반 테이블과 같이 사용할 수 있습니다. 단, CTAS 데이터 세트의 단점은 관련 데이터가 업데이트되었을 때 새로 고쳐지지 않는다는 것입니다.  뿐만 아니라, CTAS 정의는 데이터베이스 시스템에 저장되지 않습니다. 테이블이 CTAS에 의해 생성되었는지 여부를 알 수 없기 때문에 어느 CTAS를 새로 고쳐야 하며 어느 것이 최신인지 추적하기가 어렵습니다.

이제 Amazon Redshift를 위한 구체화 보기(Materialized View)를 도입합니다. MV(구체화 보기)는 질의 데이터를 포함하는 데이터베이스 객체입니다. 구체화된 보기는 캐시와 같습니다. 데이터 세트를 런타임 시 구축 및 계산하는 대신, 구체화된 보기는 보기를 생성하는 시점에 데이터를 사전 계산하고, 저장하고, 데이터 액세스를 최적화합니다. 데이터는 일반 테이블 데이터와 똑같이 준비되고 쿼리에 사용할 수 있습니다.

기준 테이블의 데이터가 변경되면 Redshift SQL문 “refresh materialized view“를 사용하여 구체화된 보기를 새로 고쳐야 합니다. 새로 고침 문을 사용한 후에는 구체화된 보기에 일반 보기가 반환하는 것과 동일한 데이터가 포함됩니다. 새로 고침은 증분적 새로 고침 또는 전체 새로 고침(재계산)이 될 수 있습니다. 가능한 경우, Redshift는 구체화된 보기가 마지막으로 새로 고쳐진 후에 기준 테이블에서 변경된 데이터를 증분적으로 새로 고칩니다.

이제 작동 방식을 살펴 보겠습니다. 판매 정보, 즉 각 판매 거래 및 판매가 발생한 매장에 대한 세부 정보를 저장할 샘플 스키마를 생성합니다.

도시별 총 판매량을 보기 위해 create materialized view SQL문으로 구체화된 보기를 생성합니다. Redshift 콘솔에 연결하고, 쿼리 Editor를 선택하고 다음 문을 입력하여 두 개의 테이블에 있는 레코드를 조인하고 도시별(group by city) 판매 금액(sum(sales.amount))을 집계하는 구체화된 보기(city_sales)를 생성합니다.

CREATE MATERIALIZED VIEW city_sales AS (
  SELECT st.city, SUM(sa.amount) as total_sales
  FROM sales sa, store st
  WHERE sa.store_id = st.id
  GROUP BY st.city
);

그 결과 다음과 같은 스키마가 만들어집니다.

이제 일반 보기 또는 테이블과 똑같이 구체화된 보기를 쿼리할 수 있으며 “SELECT city, total_sales FROM city_sales”와 같은 문을 통해 아래의 결과를 얻을 수 있습니다. 두 테이블의 조인 및 집계(sum and group by)는 이미 계산되어 있으므로 검색할 데이터가 상당히 줄어듭니다.

기준 테이블의 데이터가 변경되면 구체화된 보기에는 이러한 변경 사항이 자동으로 반영되지 않습니다. 구체화된 보기에 저장된 데이터는 온디맨드 방식으로 SQL refreshmaterialized view 명령을 사용하여 기준 테이블의 최신 변경 사항으로 새로 고칠 수 있습니다. 실제 예를 살펴보겠습니다.

!-- let's add a row in the sales base table
INSERT INTO sales (id, item, store_id, customer_id, amount)
VALUES(8, 'Gaming PC Super ProXXL', 1, 1, 3000);

SELECT city, total_sales FROM city_sales WHERE city = 'Paris'

city |total_sales|
-----|-----------|
Paris|        690|

!-- the new sale is not taken into account !

!-- let's refresh the materialized view
REFRESH MATERIALIZED VIEW city_sales;

SELECT city, total_sales FROM city_sales WHERE city = 'Paris'

city |total_sales|
-----|-----------|
Paris|       3690|

!-- now the view has the latest sales data

간단한 이 데모의 전체 코드는 gist 형태로 제공됩니다. 구체화된 보기는 지금 모든 AWS 리전에서 사용할 수 있습니다. 기존 클러스터의 어떤 부분도 변경하지 않고 구체화된 보기를 사용할 수 있으며, 추가 비용 없이 지금 바로 생성할 수 있습니다.

– Sébastien Stormacq;