물리뷰(Materialized View)는 원본 테이블의 쿼리 결과를 미리 계산하여 물리적으로 저장해둔 객체입니다. 일반 뷰(View)가 쿼리를 실행할 때마다 기본 테이블에서 데이터를 가져와 계산하는 것과 달리, 물리뷰는 쿼리 결과를 저장하고 있다가 사용자가 물리뷰를 조회할 때 저장된 결과를 반환합니다.
데이터브릭스 SQL에서 물리뷰는 Unity Catalog에서 관리되는 테이블로, 사용자가 소스 테이블의 최신 데이터를 기반으로 결과를 미리 계산할 수 있게 해줍니다. 데이터브릭스의 물리뷰는 다른 구현과 달리 물리뷰가 마지막으로 새로고침(refresh)되었을 때의 데이터 상태를 반영하며, 물리뷰를 쿼리할 때마다 결과를 항상 업데이트하지는 않습니다. 물리뷰는 수동으로 새로고침하거나 스케줄링하여 자동으로 새로고침할 수 있습니다.
데이터브릭스에서 물리뷰는 Delta Live Tables(DLT) 파이프라인을 통해 관리됩니다. 데이터브릭스 SQL 웨어하우스에서 물리뷰를 생성하면 자동으로 서버리스 DLT 파이프라인이 생성되어 물리뷰의 새로고침 프로세스를 처리합니다.
물리뷰의 작동 방식은 다음과 같습니다:
물리뷰를 생성하려면 Unity Catalog가 활성화된 프로 또는 서버리스 SQL 웨어하우스를 사용해야 합니다. 또한 서버리스 파이프라인을 지원하는 워크스페이스가 필요합니다.
물리뷰를 생성하려면 CREATE MATERIALIZED VIEW
문을 사용합니다:
CopyCREATE MATERIALIZED VIEW mv1
AS SELECT
date,
sum(sales) AS sum_of_sales
FROM
base_table1
GROUP BY
date;
물리뷰를 생성하는 사용자는 물리뷰 소유자가 되며 다음 권한이 필요합니다:
SELECT
권한USE CATALOG
및 USE SCHEMA
권한USE CATALOG
및 USE SCHEMA
권한CREATE TABLE
및 CREATE MATERIALIZED VIEW
권한기본 테이블의 열 주석(comment)은 새 물리뷰에 자동으로 전파됩니다. 스케줄, 테이블 제약 조건 또는 기타 속성을 추가하려면 물리뷰 정의를 수정하면 됩니다.
물리뷰는 REFRESH MATERIALIZED VIEW
문을 사용하여 기본 테이블의 최신 변경 사항을 반영하도록 업데이트할 수 있습니다:
CopyREFRESH MATERIALIZED VIEW mv1;
기본적으로 새로고침 작업은 동기적으로 수행되지만, 비동기적으로 수행하도록 설정할 수도 있습니다:
CopyREFRESH MATERIALIZED VIEW mv1 ASYNC;
일부 쿼리는 증분 방식으로 새로고침할 수 있습니다. 증분 새로고침이 불가능한 경우 전체 새로고침이 대신 수행됩니다. 증분 새로고침을 지원하는 쿼리 유형에 대한 자세한 내용은 Incremental refresh for materialized views 문서를 참조하세요.
물리뷰는 정의된 일정에 따라 자동으로 새로고침하도록 구성할 수 있습니다. 일정을 설정하는 방법은 두 가지가 있습니다:
SCHEDULE
절을 사용:CopyCREATE MATERIALIZED VIEW mv1
SCHEDULE ON CRON '0 0 * * *' -- 매일 자정에 새로고침
AS SELECT
date,
sum(sales) AS sum_of_sales
FROM
base_table1
GROUP BY
date;
ALTER MATERIALIZED VIEW
문을 사용하여 기존 물리뷰에 일정 추가:CopyALTER MATERIALIZED VIEW mv1
SET SCHEDULE ON CRON '0 0 * * *';
일정이 생성되면 업데이트를 처리하기 위한 새로운 데이터브릭스 작업이 자동으로 구성됩니다.
일정을 확인하려면 다음 중 하나를 수행할 수 있습니다:
DESCRIBE EXTENDED
문 실행물리뷰는 데이터 공유를 지원하면서 잠재적으로 민감한 데이터가 노출되는 것을 방지하기 위한 풍부한 접근 제어를 지원합니다. 물리뷰 소유자 또는 MANAGE
권한이 있는 사용자는 다른 사용자에게 SELECT
권한을 부여할 수 있습니다.
물리뷰에 대한 접근 권한을 부여하려면 GRANT
문을 사용합니다:
CopyGRANT privilege_type [, privilege_type ] ...
ON <mv_name> TO principal;
권한 유형은 다음과 같습니다:
SELECT
: 사용자가 물리뷰를 조회할 수 있습니다.REFRESH
: 사용자가 물리뷰를 새로고침할 수 있습니다. 새로고침은 소유자의 권한으로 실행됩니다.예시:
CopyCREATE MATERIALIZED VIEW <mv_name> AS SELECT * FROM <base_table>;
GRANT SELECT ON <mv_name> TO user;
GRANT REFRESH ON <mv_name> TO user;
물리뷰에서 접근 권한을 취소하려면 REVOKE
문을 사용합니다:
CopyREVOKE privilege_type [, privilege_type ]
ON <mv_name> FROM principal;
물리뷰 새로고침의 상태를 모니터링하고 관리하는 여러 방법이 있습니다.
물리뷰 새로고침의 상태를 확인하려면 다음 방법을 사용할 수 있습니다:
DESCRIBE EXTENDED
명령이 반환하는 새로고침 정보를 확인합니다.CopySELECT *
FROM event_log(TABLE(<fully-qualified-table-name>))
WHERE event_type = "update_progress"
ORDER BY timestamp desc;
<fully-qualified-table-name>
을 카탈로그 및 스키마를 포함한 물리뷰의 정규화된 이름으로 대체합니다.
쿼리 기록 페이지를 사용하여 쿼리 세부 정보와 쿼리 프로필에 접근할 수 있으며, 이를 통해 성능이 좋지 않은 쿼리와 스트리밍 테이블 업데이트를 실행하는 데 사용되는 DLT 파이프라인의 병목 현상을 식별할 수 있습니다.
쿼리 기록 UI에서 REFRESH
문에 접근하려면 다음 단계를 따르세요:
DLT UI에서 활성 새로고침을 중지하려면 파이프라인 세부 정보 페이지에서 중지를 클릭하여 파이프라인 업데이트를 중지합니다. 또한 Databricks CLI 또는 Pipelines API의 POST /api/2.0/pipelines/{pipeline_id}/stop 작업을 사용하여 새로고침을 중지할 수 있습니다.
데이터브릭스 물리뷰에는 다음과 같은 제한사항이 있습니다:
NULL
이 가능한 열에 대해 합계 집계를 사용하는 물리뷰에서 해당 열에 NULL
값만 남아 있는 경우, 물리뷰의 결과 집계 값은 NULL
대신 0이 됩니다.물리뷰는 다양한 데이터 처리 시나리오에서 유용하게 활용될 수 있습니다:
물리뷰는 추출, 변환, 로드(ETL) 처리를 위한 간단하고 선언적인 방법을 제공합니다. 다음 예시에서는 일별 판매 데이터를 집계하는 물리뷰를 만듭니다:
CopyCREATE MATERIALIZED VIEW daily_sales_summary
AS SELECT
date,
product_category,
region,
sum(sales_amount) AS total_sales,
count(distinct customer_id) AS unique_customers
FROM
sales_transactions
GROUP BY
date, product_category, region;
물리뷰를 사용하여 데이터를 정리하고 보강할 수 있습니다:
CopyCREATE MATERIALIZED VIEW enriched_customer_data
AS SELECT
c.customer_id,
c.name,
c.email,
c.signup_date,
d.country,
d.city,
d.postal_code,
CASE WHEN o.total_orders > 10 THEN 'VIP' ELSE 'Regular' END AS customer_segment
FROM
customers c
JOIN
demographics d ON c.customer_id = d.customer_id
JOIN
(SELECT customer_id, COUNT(*) AS total_orders FROM orders GROUP BY customer_id) o
ON c.customer_id = o.customer_id;
물리뷰를 통해 자주 사용되는 복잡한 연산을 최적화할 수 있습니다:
CopyCREATE MATERIALIZED VIEW product_performance_metrics
AS SELECT
p.product_id,
p.product_name,
p.category,
COUNT(o.order_id) AS order_count,
SUM(o.quantity) AS total_quantity_sold,
SUM(o.quantity * o.unit_price) AS total_revenue,
AVG(r.rating) AS average_rating
FROM
products p
LEFT JOIN
order_items o ON p.product_id = o.product_id
LEFT JOIN
product_reviews r ON p.product_id = r.product_id
GROUP BY
p.product_id, p.product_name, p.category;
물리뷰를 사용하여 규정 준수 및 감사 목적으로 데이터를 처리할 수 있습니다:
CopyCREATE MATERIALIZED VIEW gdpr_compliance_log
AS SELECT
action_type,
user_id,
data_category,
action_timestamp,
requesting_user,
approval_status,
COUNT(*) AS action_count
FROM
data_access_logs
WHERE
action_timestamp >= current_date - INTERVAL 90 DAY
GROUP BY
action_type, user_id, data_category, action_timestamp, requesting_user, approval_status;
데이터브릭스의 물리뷰(Materialized View)는 데이터 처리 워크로드를 최적화하고 분석 성능을 향상시키는 강력한 기능입니다. 복잡한 쿼리의 결과를 미리 계산하여 저장함으로써 쿼리 지연 시간을 줄이고 비용을 절감할 수 있습니다. 또한 Delta Live Tables(DLT)와 통합되어 자동으로 새로고침을 관리하기 때문에 사용자는 데이터 파이프라인 관리에 대한 부담을 줄일 수 있습니다.
물리뷰는 ETL 처리, 데이터 정리 및 보강, 자주 사용되는 연산 최적화, 규정 준수 및 감사 등 다양한 사용 사례에서 유용하게 활용될 수 있습니다. 데이터브릭스의 물리뷰를 효과적으로 활용하여 데이터 처리 워크로드를 간소화하고 성능을 최적화해 보세요.