실체화 뷰

Tibero에서 제공하는 실체화 뷰를 사용하는 방법에 대해 기술합니다.

리프레시

마스터 테이블에 변경이 일어났을 때 이를 반영하도록 실체화 뷰를 갱신하는 동작을 리프레시라고 합니다. 리프레시를 하면 실체화 뷰의 데이터는 질의의 결과와 일치됩니다. 리프레시는 실체화 뷰를 생성하는 조건 에 따라 자동으로 수행될 수 있으며, DBMS_MVIEW 패키지의 REFRESH 함수를 이용하여 수동으로 수행 할 수도 있습니다.

리프레시는 완전 리프레시와 빠른 리프레시가 있습니다.

완전 리프레시

완전 리프레시는 실체화 뷰에 있는 기존의 데이터를 모두 삭제한 후 실체화 뷰를 정의한 질의를 다시 수행 하여 그 결과를 실체화 뷰에 저장하는 방식입니다. 완전 리프레시를 사용하기 위한 특별한 제약조건은 없습니다.

빠른 리프레시

빠른 리프레시는 마스터 테이블의 변경된 부분만을 실체화 뷰에 반영하는 방식입니다. 완전 리프레시보다 빠르다.

일반적인 제약조건

빠른 리프레시를 사용하기 위한 제약조건은 다음과 같습니다. 실체화 뷰를 정의하는 질의는 다음의 제약조건 을 만족해야 합니다.

  • 실체화 뷰는 SYSDATE와 ROWNUM과 같이 반복할 수 없는 표현식을 포함하면 안 됩니다.

  • 실체화 뷰는 LONG 또는 LONG RAW 데이터 타입을 포함하면 안 됩니다.

  • SELECT 리스트에 부질의를 포함하면 안 됩니다.

  • SELECT 리스트에 분석 함수를 포함하면 안 됩니다.

  • HAVING 절에 부질의를 포함하면 안 됩니다.

  • ANY, ALL, NOT EXISTS를 포함하면 안 됩니다.

  • [START WITH] CONNECT BY 절을 포함하면 안 됩니다.

  • 서로 다른 원격에 있는 테이블을 포함하면 안 됩니다. 즉, 쿼리에 참가하는 모든 테이블은 같은 서버에 있 어야 합니다.

  • 원격 테이블이 포함된 경우 해당 서버가 Tibero일 경우만 됩니다.

  • UNION 등의 SET 연산자를 포함하면 안 됩니다.

  • REFRESH ON COMMIT 실체화 뷰를 정의한 질의는 원격 테이블을 포함하면 안 됩니다.

일반적인 제약조건 예시

집합 함수를 포함한 제약조건

다음은 집합 함수를 포함한 제약조건에 대한 설명입니다.

  • 빠른 리프레시의 일반적인 제약조건을 모두 포함합니다.

  • 실체화 뷰의 모든 참조 테이블에는 실체화 뷰의 로그가 있어야 하며, 실체화 뷰의 로그는 다음의 제약조 건을 만족해야 합니다.

    • 실체화 뷰에서 참조하는 모든 컬럼을 포함해야 합니다.

    • SEQUENCE, ROWID와 INCLUDING NEW VALUES 조건이 있어야 합니다.

  • 함수는 SUM, COUNT, AVG, STDDEV, VARIANCE. MIN, MAX 함수만 지원됩니다.

  • COUNT(*)는 항상 포함해야 합니다.

  • 집합 함수는 항상 표현식의 최상위에 있어야 합니다. 단, AVG(COUNT(X)), COUNT(X) * COUNT(X)는 허 용하지 않습니다.

  • AVG(expr)에 대응되는 COUNT(expr)가 있어야 합니다.

집단 함수
필요 집단 함수

COUNT(expr)

-

MIN(expr)

-

MAX(expr)

-

SUM(expr)

COUNT(expr)

SUM(col), col에 NOT NULL 제약

-

AVG(expr)

COUNT(expr)

STDDEV(expr)

SUM(expr), COUNT(expr)

VARIANCE(expr)

SUM(expr), COUNT(expr)

  • SELECT 리스트에는 모든 GROUP BY 컬럼이 있어야 합니다.

  • CUBE, ROLLUP은 허용하지 않습니다.

집합 함수를 포함한 제약조건 예시

질의 다시 쓰기

실체화 뷰의 가장 큰 장점은 질의 다시 쓰기 (Query Rewrite) 기능을 사용할 수 있습니다는 것입니다.

질의 다시 쓰기는 주어진 질의를 분석한 후 실체화 뷰를 사용하여 동일한 결과를 내는 새로운 질의를 생성 하는 기능입니다. 실체화 뷰가 복잡한 조인이나 집단 함수의 결과로 정의되어 있습니다면 질의 다시 쓰기를 통해 실행 시간을 크게 단축할 수 있습니다.

질의 다시 쓰기는 사용자가 명시한 명령 없이도 질의 최적화기에 의해 수행되므로 실체화 뷰를 인덱스처 럼 사용할 수 있습니다. INSERT, DELETE, UPDATE, MERGE의 대상이 되는 부질의를 제외한 모든 SELECT 문에 동작합니다.

circle-info

참고

EXPLAIN PLAN 문을 통해서 실행 계획을 보면 질의 다시 쓰기에 의해 참조된 실체화 뷰는 MV_REWRITE라고 표시됩니다.

동작 조건

질의 다시 쓰기 기능을 동작하기 위한 조건은 다음과 같습니다.

  • 실체화 뷰를 생성할 때 ENABLE QUERY REWRITE 옵션을 추가해야 합니다.

  • QUERY_REWRITE_ENABLED 파라미터의 값이 TRUE나 FORCE로 설정되어 있어야 합니다.

설정 값
설명

FALSE

질의 다시 쓰기 기능을 비활성화 시킴

TRUE

  • 질의 다시 쓰기 기능을 활성화 시킴

  • 플랜의 비용을 비교했을 때 질의 다시 쓰기 기능을 사용하는것이 비용이 더 높으면 기능이 동작하지 않을 수 있음

FORCE

비용에 상관없이 질의 다시 쓰기 기능이 동작

  • 질의 다시 쓰기가 QUERY_REWRITE_INTEGRITY 파라미터의 설정을 만족시켜야 합니다.

QUERY_REWRITE_INTEGRITY 파라미터는 다음의 설정 값을 통해 질의 다시 쓰기의 정확도를 조절 할 수 있습니다.

설정 값
설명

ENFORCED

최신 데이터가 있는 실체화 뷰만 사용하여 원본 질의와 동일한 결과를 보장

STALE_TOLERATED

  • 최신 데이터의 변경 내용이 반영되지 않은 실체화 뷰를 사용하기 때문에 원본 질의와 동일한 결과를 보장하지 않음

  • 단, 질의 다시 쓰기가 될 가능성은 커짐

동작 방식

질의 다시 쓰기를 하려면 원본 질의와 사용할 실체화 뷰의 질의를 비교해서 원본 질의가 실체화 뷰를 사용 해서 얻어질 수 있는지를 확인해야 합니다. 현재는 완전 문자열 비교와 부분 문자열 비교 방식을 지원합니다.

완전 문자열 비교

원본 질의와 사용할 실체화 뷰의 질의에 대해 전체 문자열을 비교합니다. 이때 공백이나 대소문자의 차이는 무시됩니다.

예를 들어 다음과 같은 실체화 뷰가 있다고 가정해봅니다.

  1. 다음과 같은 질의를 실행한다면,

  1. 다음과 같이 질의 다시 쓰기가 동작하게 됩니다.

부분 문자열 비교

원본 질의와 사용할 실체화 뷰의 질의에 대해 FROM 절부터 ORDER BY 절 앞까지(존재할 경우)의 문자 열을 비교하고, SELECT 리스트와 ORDER BY 절의 연산식에서 사용되는 컬럼의 적합성을 조사합니다.

컬럼의 적합성을 조사하는 방법은 다음과 같습니다.

원본 질의의 SELECT 리스트 컬럼이 실체화 뷰의 컬럼을 조합해서 얻어질 수 있는지를 검사합니다. 이때 조 인에 의해 같아지는 컬럼을 처리합니다.

예를 들어 다음과 같은 실체화 뷰가 있다고 가정해봅니다.

  1. 다음과 같은 질의를 실행합니다면,

  1. 다음과 같이 질의 다시 쓰기가 동작하게 됩니다.

또한, 연산의 교환, 결합, 분배 법칙을 이용하여 동등한 연산식의 컬럼을 처리합니다.

예를 들어 다음과 같은 실체화 뷰가 있다고 가정해봅니다.

  1. 다음과 같은 질의를 실행한다면,

  1. 다음과 같이 질의 다시 쓰기가 동작하게 됩니다.

집단 함수를 사용할 때 집단 함수의 적합성을 조사하는 방법은 다음과 같습니다.

해당되는 집단 함수가 없어도 다른 집단 함수를 조합하여 원하는 집단 함수를 얻을 수 있습니다. 예를 들어AVG(SALARY)는 SUM(SALARY) / COUNT(SALARY)로 구할 수 있습니다.

다음은 집단 함수의 적합성을 조사한 표입니다.

목표 집단 함수
필요 집단 함수

AVG(expr)

SUM(expr), COUNT(expr)

SUM(expr)

AVG(expr), COUNT(expr)

STDDEV(expr)

VARIANCE(expr)

STDDEV(expr)

(STDDEV_SAMP(expr), STDDEV_POP(expr), VAR_SAMP(expr), VAR_POP(expr)) 중 하나, COUNT(expr)

STDDEV(expr)

SUM(expr * expr), SUM(expr), COUNT(expr)

STDDEV_SAMP(expr)

VAR_SAMP(expr)

STDDEV_SAMP(expr)

(STDDEV(expr), STDDEV_POP(expr), VARIANCE(expr), VAR_POP(expr)) 중 하나, COUNT(expr)

STDDEV_SAMP(expr)

SUM(expr * expr), SUM(expr), COUNT(expr)

STDDEV_POP(expr)

VAR_POP(expr)

STDDEV_POP(expr)

(STDDEV(expr), STDDEV_SAMP(expr), VARIANCE(expr), VAR_SAMP(expr)) 중 하나, COUNT(expr)

STDDEV_POP(expr)

SUM(expr * expr), SUM(expr), COUNT(expr)

VARIANCE(expr)

STDDEV(expr)

VARIANCE(expr)

(STDDEV_SAMP(expr), STDDEV_POP(expr), VAR_SAMP(expr), VAR_POP(expr)) 중 하나, COUNT(expr)

VARIANCE(expr)

SUM(expr * expr), SUM(expr), COUNT(expr)

VAR_SAMP(expr)

STDDEV_SAMP(expr)

VAR_SAMP(expr)

(STDDEV(expr), STDDEV_POP(expr), VARIANCE(expr), VAR_POP(expr)) 중 하나, COUNT(expr)

VAR_SAMP(expr)

SUM(expr * expr), SUM(expr), COUNT(expr)

VAR_POP(expr)

STDDEV_POP(expr)

VAR_POP(expr)

(STDDEV(expr), STDDEV_SAMP(expr), VARIANCE(expr), VAR_SAMP(expr)) 중 하나, COUNT(expr)

VAR_POP(expr)

SUM(expr * expr), SUM(expr), COUNT(expr)

비용 기반 최적화

원본 질의와 다시 쓰여진 질의로부터 비용 기반 최적화 기법에 의해 각각의 실행 계획이 생성되고, 최종으로 두 실행 계획 중에서 비용이 적은 쪽이 선택됩니다. 질의 다시 쓰기는 실행 비용에 따라 최종 선택이 달라지기 때문에 원본 질의가 참조하는 테이블과 실체화 뷰를 저장하고 있는 테이블의 통계 정보를 생성합니다.

원격 저장소를 가진 실체화 뷰

이기종 데이터베이스에서 실체화 뷰를 이용하여 Tibero에 있는 베이스 테이블의 데이터를 동기화하고 싶 을 때 사용하는 기능입니다.

이기종 데이터베이스에서 Tibero에 있는 베이스 테이블를 조회하는 실체화 뷰를 생성해도 빠른 리프레시 는 수행이 불가능합니다. 따라서 이 기능을 통해 실체화 뷰 관리를 Tibero쪽 데이터베이스가 담당하게 하고, 실제 저장소는 이기종 데이터베이스에 위치하게 하여 조회가 가능하게 합니다. 현재 이기종 데이터베이스 는 Oracle만 지원합니다.

아래 설명을 하기 전에 베이스 테이블이 위치한 데이터베이스를 A, 실체화 뷰 저장소 테이블이 위치할 오 라클 서버를 B이라 가정합니다.

실체화 뷰 생성 사전 작업

실체화 뷰 생성에 하기 전에 아래와 같은 사전 작업이 필요합니다. 베이스 테이블이 위치한 데이터베이스를A, 실체화 뷰 저장소 테이블이 위치할 오라클 서버를 B이라 가정합니다.

  • B의 해당 계정에 Tibero에서 제공하는 $TB_HOME/scripts/mview_remote_install.sql 스크립트를 수행 하여 기능에 필요한 PSM 패키지를 설치합니다.

  • A에서 B로의 데이터베이스 링크를 생성합니다.

  • PREBUILT 옵션만 지원하므로, 저장소 테이블을 사전에 생성합니다.

실체화 뷰 생성

A에서 실체화 뷰를 생성하지만, 실제 조회가 가능한 저장소 테이블은 B에 있습니다.

CREATE MATERIALIZED VIEW를 생성할 때 AT dblink_name 속성을 추가하여, A에서 B로의 데이터베 이스 링크를 지정합니다. 정확한 문법은 “CREATE TABLE”을 참고합니다.

리프레시 및 저장소 테이블 조회

실체화 뷰 리프레시는 A에서 수행합니다. 리프레시가 된 결과는 B의 저장소 테이블에 저장됩니다. 그 외의 사 항에 대해서는 일반 실체화 뷰와 동일합니다.

제약 사항

원격 저장소를 가진 실체화 뷰는 아래와 같은 제약 사항이 있습니다.

  • 베이스 테이블이 이기종 데이터베이스에 있고 저장소 테이블을 Tibero에 저장하는 실체화 뷰는 지원하 지 않습니다.

  • 빠른 리프레시의 경우 실체화 뷰 질의가 집합 함수가 없는 단일 베이스 테이블에 대한 질의이어야 합니다.

  • 그 외의 사항은 일반 실체화 뷰 질의의 제약 조건과 동일합니다.

Last updated