구체화된 뷰

구체화된 뷰 (Materialized Views)

구체화된 뷰의 이름은 다음과 같이 정의돼요.

출처: Materialized Views

본문

view_name::= re('[a-zA-Z_0-9]+')

CREATE MATERIALIZED VIEW

CREATE MATERIALIZED VIEW 문을 사용해 테이블에 구체화된 뷰를 만들 수 있어요.

create_materialized_view_statement::= CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] view_name
	AS select_statement
	PRIMARY KEY '(' primary_key')'
	WITH table_options

예를 들어:

CREATE MATERIALIZED VIEW monkeySpecies_by_population AS
   SELECT * FROM monkeySpecies
   WHERE population IS NOT NULL AND species IS NOT NULL
   PRIMARY KEY (population, species)
   WITH comment='Allow query by population instead of species';

CREATE MATERIALIZED VIEW 문은 새 구체화된 뷰를 만들어요. 각 뷰는 SELECT 문에 지정된 기본(base) 테이블에 존재하는 행에 해당하는 행(rows) 집합이에요. 구체화된 뷰는 직접 갱신할 수 없지만, 기본 테이블에 대한 갱신은 뷰에 대응하는 갱신을 발생시켜요.

구체화된 뷰를 만드는 것은 세 가지 주요 부분으로 구성돼요.

  • 뷰에 포함될 데이터를 제한하는 select 문.
  • 뷰의 기본 키 정의.
  • 뷰의 옵션.

이미 존재하는 구체화된 뷰를 만들려고 하면 IF NOT EXISTS 옵션을 사용하지 않는 한 오류가 반환돼요. IF NOT EXISTS를 사용하면 구체화된 뷰가 이미 존재할 때 해당 문은 no-op이 돼요.

참고: 기본적으로 구체화된 뷰는 단일 스레드로 만들어져요. cassandra.yamlconcurrent_materialized_view_builders 속성으로 스레드 수를 늘리면 초기 빌드를 병렬화할 수 있어요. 이 속성은 JMX와 setconcurrentviewbuilders/getconcurrentviewbuilders nodetool 명령을 통해 런타임에 조작할 수도 있어요.

MV select 문

구체화된 뷰 생성의 select 문은 기본 테이블 중 어떤 것을 뷰에 포함할지 정의해요. 이 문은 여러 방식으로 제한돼요.

  • 선택은 기본 테이블의 컬럼만 선택하는 것으로 제한돼요. 즉, 함수(집계 여부와 관계없이), 캐스팅, term 등을 사용할 수 없어요. 별칭도 지원되지 않아요. 단, 모든 컬럼을 선택하는 축약형으로 *를 사용할 수 있어요. 또한 정적 컬럼은 구체화된 뷰에 포함될 수 없어요. 따라서 기본 테이블에 정적 컬럼이 있으면 SELECT * 명령이 허용되지 않아요. WHERE 절에는 다음 제한이 있어요.
    • bind_marker를 포함할 수 없어요.
    • IS NOT NULL 제한으로 제한되지 않는 기본 테이블 기본 키에 속하지 않는 컬럼을 가질 수 없어요.
    • 다른 제한은 허용되지 않아요.
    • 기본 키의 일부인 컬럼은 null일 수 없고, 적어도 IS NOT NULL 제한(또는 어떤 다른 제한이든 하나는 있어야 함)으로 제한되어야 해요.
  • ordering 절, limit, ALLOW FILTERING을 가질 수 없어요.

MV 기본 키

뷰는 기본 키가 있어야 하며, 그 기본 키는 다음 제한을 따라야 해요.

  • 기본 테이블의 모든 기본 키 컬럼을 포함해야 해요. 이는 뷰의 모든 행이 기본 테이블의 정확히 한 행에 대응하도록 보장해요.
  • 기본 테이블의 기본 키 컬럼이 아닌 컬럼을 단 하나만 포함할 수 있어요.

예를 들어 다음 기본 테이블 정의가 주어졌을 때:

CREATE TABLE t (
    k int,
    c1 int,
    c2 int,
    v1 int,
    v2 int,
    PRIMARY KEY (k, c1, c2)
);

다음 뷰 정의는 허용돼요:

CREATE MATERIALIZED VIEW mv1 AS
   SELECT * FROM t
   WHERE k IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL
   PRIMARY KEY (c1, k, c2);

CREATE MATERIALIZED VIEW mv1 AS
  SELECT * FROM t
  WHERE k IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL
  PRIMARY KEY (v1, k, c1, c2);

하지만 다음 뷰 정의는 허용되지 않아요:

// Error: cannot include both v1 and v2 in the primary key as both are not in the base table primary key

CREATE MATERIALIZED VIEW mv1 AS
   SELECT * FROM t
   WHERE k IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL AND v1 IS NOT NULL
   PRIMARY KEY (v1, v2, k, c1, c2);

// Error: must include k in the primary as it's a base table primary key column

CREATE MATERIALIZED VIEW mv1 AS
   SELECT * FROM t
   WHERE c1 IS NOT NULL AND c2 IS NOT NULL
   PRIMARY KEY (c1, c2);

MV 옵션

구체화된 뷰는 내부적으로 테이블로 구현되므로, MV를 만들 때는 테이블을 만들 때와 같은 옵션을 허용해요.

ALTER MATERIALIZED VIEW

생성 후에는 ALTER MATERIALIZED VIEW 문을 사용해 구체화된 뷰의 옵션을 변경할 수 있어요.

alter_materialized_view_statement::= ALTER MATERIALIZED VIEW [ IF EXISTS ] view_name WITH table_options

갱신 가능한 옵션은 생성 시점과 동일하며, 따라서 테이블과 동일한 옵션이에요. 뷰가 존재하지 않으면, IF EXISTS를 사용하지 않는 한 오류가 반환돼요. IF EXISTS를 사용하면 그 연산은 no-op이 돼요.

DROP MATERIALIZED VIEW

구체화된 뷰를 제거할 때는 DROP MATERIALIZED VIEW 문을 사용해요.

drop_materialized_view_statement::= DROP MATERIALIZED VIEW [ IF EXISTS ] view_name;

구체화된 뷰가 존재하지 않으면, IF EXISTS를 사용하지 않는 한 오류가 반환돼요. IF EXISTS를 사용하면 그 연산은 no-op이 돼요.

MV 제한 사항 (MV Limitations)

참고: 구체화된 뷰에서 선택되지 않은 컬럼의 제거(UPDATE base SET unselected_column = null 또는 DELETE unselected_column FROM base)는 힌트(hints)나 복구(repair)로 받은 다른 컬럼에 대한 누락된 갱신을 가릴 수 있어요. 따라서 CASSANDRA-13826에서 수정될 때까지는 뷰에서 선택되지 않은 기본 컬럼에 대한 삭제를 수행하지 않는 것이 좋아요.

더 알아보기 (Learn more)