다음을 통해 공유


Databricks SQL에서 구체화된 뷰 사용

이 문서에서는 Databricks SQL에서 구체화된 뷰를 만들고 사용하여 성능을 향상시키고 데이터 처리 및 분석 워크로드 비용을 줄이는 방법을 설명합니다.

참고 항목

구체화된 뷰에서 Azure Private Link 연결을 사용해야 하는 경우 Databricks 담당자에게 문의하세요.

Important

Databricks SQL에서 만든 구체화된 뷰는 서버리스 Delta Live Tables 파이프라인에서 지원됩니다. 이 기능을 사용하려면 작업 영역에서 서버리스 파이프라인을 지원해야 합니다.

구체화된 뷰란?

Databricks SQL에서 구체화된 뷰는 사용자가 원본 테이블의 최신 데이터 버전을 기반으로 결과를 미리 계산할 수 있도록 하는 Unity 카탈로그 관리 테이블입니다. 구체화된 뷰를 쿼리할 때 항상 결과를 업데이트하는 대신 구체화된 뷰를 마지막으로 새로 고칠 때 반환된 결과가 데이터 상태를 반영하기 때문에 Azure Databricks의 구체화된 뷰는 다른 구현과 다릅니다. 구체화된 뷰를 수동으로 새로 고치거나 새로 고침을 예약할 수 있습니다.

구체화된 뷰는 ETL(추출, 변환 및 로드) 처리와 같은 데이터 처리 워크로드에 강력합니다. 구체화된 뷰는 규정 준수, 수정, 집계 또는 CDC(일반 변경 데이터 캡처)를 위해 데이터를 처리하는 간단하고 선언적인 방법을 제공합니다. 구체화된 뷰는 느린 쿼리와 자주 사용되는 계산을 미리 계산하여 비용을 절감하고 쿼리 대기 시간을 개선합니다. 구체화된 뷰는 기본 테이블을 정리, 보강 및 비정규화하여 사용하기 쉬운 변환을 가능하게 합니다. 구체화된 뷰는 간단한 최종 사용자 환경을 제공하면서 비용을 절감할 수 있습니다. 경우에 따라 기본 테이블의 변경 내용을 증분 방식으로 계산할 수 있기 때문입니다.

Azure Databricks는 Delta Live Tables의 출시와 함께 구체화된 뷰를 처음으로 지원했습니다. Databricks SQL 웨어하우스 에서 구체화된 뷰를 만들면 구체화된 뷰로 새로 고침을 처리하기 위해 서버리스 파이프라인 이 만들어집니다. Delta Live Tables UI 또는 파이프라인 API새로 고침 작업의 상태를 모니터링할 수 있습니다. 을(를) 참조하고, 구체화된 뷰 새로 고침의 상태를 확인하세요.

요구 사항

구체화된 뷰를 만들거나 새로 고치려면 다음을 수행합니다.

  • Unity 카탈로그를 지원하는 프로페셔널 또는 서버리스 SQL 웨어하우스를 사용해야 합니다.

  • 구체화된 뷰를 새로 고치려면 만든 작업 영역에 있어야 합니다.

  • 작업 공간은 서버리스 SQL Warehouse를 지원하는 지역에 있어야 합니다.

구체화된 뷰를 쿼리하려면 다음을 수행합니다.

  • 구체화된 뷰의 소유자이거나 구체화된 뷰에 SELECT가 있고 부모에 USE SCHEMAUSE CATALOG가 있어야 합니다.
  • 다음 컴퓨팅 리소스 중 하나를 사용해야 합니다.
    • SQL Warehouse
    • Delta Live Tables 인터페이스
    • 공유 액세스 모드 컴퓨팅
    • 작업 영역이 서버리스 컴퓨팅에 사용하도록 설정된 한 Databricks Runtime 15.4 이상의 단일 사용자 액세스 모드입니다. 단일 사용자 컴퓨팅에 대한 세분화된 액세스 제어를 참조 하세요.
    • 구체화된 뷰 소유자인 경우에만 14.3에서 15.3 사이의 Databricks 런타임을 실행하는 단일 사용자 액세스 모드 컴퓨팅 리소스입니다.

구체화된 뷰 사용에 대한 다른 제한 사항에 대해 알아보려면 제한 사항참조하세요.

구체화된 뷰 만들기

Databricks SQL 구체화된 뷰 CREATE 작업은 Databricks SQL Warehouse를 사용하여 구체화된 뷰에서 데이터를 만들고 로드합니다. 구체화된 뷰를 만드는 것은 동기 작업입니다. 즉, 구체화된 뷰가 만들어지고 초기 데이터 로드가 완료될 때까지 CREATE MATERIALIZED VIEW 명령이 차단됩니다. 서버리스 Delta Live Tables 파이프라인은 모든 Databricks SQL 구체화된 뷰에 대해 자동으로 만들어집니다. Delta Live Tables 파이프라인이 구체화된 뷰가 새로 고쳐질 때 새로 고침을 처리합니다.

구체화된 뷰를 만들려면 CREATE MATERIALIZED VIEW 문을 사용합니다. create 문을 제출하려면 Azure Databricks UI, Databricks SQL CLI 또는 Databricks SQL API의 SQL 편집기를 사용합니다.

참고 항목

구체화된 뷰를 만드는 사용자는 구체화된 뷰 소유자이며 다음 권한이 있어야 합니다.

  • 구체화된 뷰가 참조하는 기본 테이블에 대한 SELECT 권한.
  • 구체화된 뷰에 대한 원본 테이블을 포함하는 카탈로그 및 스키마에 대한 USE CATALOGUSE SCHEMA 권한입니다.
  • 구체화된 뷰를 위한 대상 카탈로그 및 스키마에 대한 USE CATALOGUSE SCHEMA 권한.
  • 구체화된 뷰를 포함하는 스키마에 대한 CREATE TABLECREATE MATERIALIZED VIEW 권한입니다.

다음 예제에서는 기본 테이블 mv1구체화된 뷰 base_table1 만듭니다.

CREATE MATERIALIZED VIEW mv1
AS SELECT
  date,
  sum(sales) AS sum_of_sales
FROM
  base_table1
GROUP BY
  date;

기본 테이블의 열 주석은 구체화된 새 뷰로 자동으로 전파됩니다. 일정, 테이블 제약 조건 또는 기타 속성을 추가하려면 구체화된 뷰 정의를 수정합니다. 구체화된 뷰를 정의하기 위한 구문 세부 정보를 알아보려면 CREATE MATERIALIZED VIEW참조하세요.

런타임 채널 설정

SQL 웨어하우스를 사용하여 만든 구체화된 뷰는 Delta Live Tables 파이프라인을 사용하여 자동으로 새로 고쳐집니다. Delta Live Tables 파이프라인은 기본적으로 current 채널에서 런타임을 사용합니다. 릴리스 프로세스에 대한 자세한 내용은 Delta Live Tables 릴리스 정보 및 릴리스 업그레이드 프로세스 참조하세요.

Databricks는 프로덕션 워크로드에 current 채널을 사용하는 것이 좋습니다. 새로운 기능이 채널에 preview 처음 릴리스됩니다. 테이블 속성으로 preview 지정하여 새 기능을 테스트하도록 파이프라인을 미리 보기 델타 라이브 테이블 채널로 설정할 수 있습니다. 테이블을 만들 때 또는 ALTER 문을 사용하여 테이블을 만든 후에 이 속성을 지정할 수 있습니다.

다음 코드 예제에서는 CREATE 문에서 채널을 미리 보기로 설정하는 방법을 보여 줍니다.

CREATE OR REPLACE MATERIALIZED VIEW foo.default.bar
TBLPROPERTIES ('pipelines.channel' = 'preview') as
SELECT
  *
FROM
  range(5)

외부 시스템에서 데이터 로드

Databricks는 지원되는 데이터 원본에 대해 Lakehouse Federation을 사용하여 외부 데이터를 로드하는 것이 좋습니다. Lakehouse Federation에서 지원하지 않는 원본에서 데이터를 로드하는 방법에 대한 자세한 내용은 데이터 형식 옵션을 참조하세요.

구체화된 뷰 새로 고침

REFRESH 작업은 구체화된 뷰를 새로 고쳐 기본 테이블의 최신 변경 내용을 반영합니다. 작업은 기본적으로 동기적입니다. 즉, 새로 고침 작업이 완료될 때까지 명령이 차단됩니다. 구체화된 뷰를 새로 고치려면 REFRESH MATERIALIZED VIEW 문을 사용합니다. 이 명령에 대한 SQL 구문 및 매개 변수에 대한 자세한 내용은 REFRESH(MATERIALIZED VIEW 또는 STREAMING TABLE) 참조하세요. 증분 새로 고침이 가능한 구체화된 뷰 유형에 대해 더 알아보려면 구체화된 뷰의 증분 새로 고침을 참조하세요.

새로 고침 문을 제출하려면 Azure Databricks UI의 SQL 편집기, SQL 웨어하우스에 연결된 Notebook, Databricks SQL CLI또는 Databricks SQL API사용합니다.

소유자만 구체화된 뷰를 REFRESH 할 수 있습니다.

다음 예제는 mv1 구체화된 뷰를 새로 고치는 예제입니다:

REFRESH MATERIALIZED VIEW mv1;

Databricks SQL 구체화된 뷰는 어떻게 새로 고쳐지나요?

구체화된 뷰는 서버리스 Delta Live Tables 파이프라인을 자동으로 만들고 사용하여 새로 고침 작업을 처리합니다. 새로 고침은 Delta Live Tables 파이프라인에서 관리되며, 구체화된 뷰를 만드는 데 사용되는 Databricks SQL 웨어하우스에서 업데이트를 모니터링합니다. 구체화된 뷰는 일정에 따라 실행되는 Delta Live Tables 파이프라인을 사용하여 업데이트할 수 있습니다. 트리거된 파이프라인 모드와 연속 파이프라인 모드를 참조하세요.

참고 항목

Delta Live Tables 런타임은 델타가 아닌 데이터 원본의 변경 내용을 검색할 수 없습니다. 테이블은 계속 정기적으로 업데이트되지만 과도한 재컴퓨팅으로 인해 컴퓨팅에서 발생하는 증분 처리 속도가 느려지는 것을 방지하기 위해 더 높은 기본 트리거 간격으로 업데이트됩니다.

기본적으로 새로 고침 작업은 동기적으로 수행됩니다. 새로 고침 작업이 비동기적으로 수행되도록 설정할 수도 있습니다. 새로 고침 명령을 사용하여 설정할 수 있습니다. REFRESH(MATERIALIZED VIEW 또는 STREAMING TABLE) 각 접근 방식과 관련된 동작은 다음과 같습니다.

  • 동기: 동기 새로 고침을 사용하면 새로 고침이 완료될 때까지 다른 작업이 진행되지 않습니다. Databricks 작업과 같은 오케스트레이션 도구에서 새로 고침 작업을 시퀀싱하는 경우와 같이 다음 단계에 결과가 필요한 경우 동기 새로 고침을 사용합니다. 구체화된 뷰를 작업과 함께 오케스트레이션하려면 SQL 태스크 유형을 사용합니다. Databricks에서의 오케스트레이션 개요를 참조하세요.
  • 비동기: 구체화된 뷰 업데이트가 시작될 때 비동기 업데이트가 Delta Live Tables 컴퓨팅에서 백그라운드 작업을 시작하여, 데이터 로드가 완료되기 전에 명령을 반환할 수 있습니다. 이 새로 고침 유형은 작업이 명령이 시작된 웨어하우스에서 컴퓨팅 용량을 반드시 보유하지는 않으므로 비용을 절감할 수 있습니다. 새로 고침이 유휴 상태가 되고 다른 작업이 실행되고 있지 않으면 새로 고침이 사용 가능한 다른 컴퓨팅을 사용하는 동안 웨어하우스가 종료될 수 있습니다. 또한 비동기 새로 고침은 여러 작업을 병렬로 시작할 수 있습니다.

일부 쿼리는 증분 방식으로 새로 고칠 수 있습니다. 증분 새로 고침 을(를) 참조하여 구체화된 뷰을(를) 확인하세요. 증분 새로 고침을 수행할 수 없는 경우 전체 새로 고침이 대신 수행됩니다.

구체화된 뷰 새로 고침 예약

정의된 일정에 따라 자동으로 새로 고쳐지도록 Databricks SQL 구체화된 보기를 구성할 수 있습니다. 일정을 설정하려면 다음 중 하나를 수행합니다.

  • SCHEDULE 절을 사용하여 일정을 구성합니다.
  • ALTER MATERIALIZED VIEW 문을 사용하여 일정을 추가합니다.

일정을 만들면 업데이트를 처리하도록 새 Databricks 작업이 자동으로 구성됩니다.

일정을 보려면 다음 중 하나를 수행하세요.

  • Azure Databricks UI의 SQL 편집기에서 DESCRIBE EXTENDED 문을 실행합니다.
  • 카탈로그 탐색기를 사용하여 구체화된 뷰를 봅니다. 일정은 개요 탭의 새로 고침 상태나열됩니다. 카탈로그 탐색기란 참조하세요..

구체화된 뷰 새로 고침의 상태 보기

참고 항목

Delta Live Tables 파이프라인은 구체화된 뷰 새로 고침을 관리하므로 파이프라인의 시작 시간에 의해 대기 시간이 발생합니다. 이 시간은 새로 고침을 수행하는 데 필요한 시간 외에도 초에서 분 단위로 표시될 수 있습니다.

Delta Live Tables UI에서 구체화된 뷰를 관리하는 파이프라인을 보거나 구체화된 뷰에 대한 명령에서 반환된 DESCRIBE EXTENDED 확인하여 구체화된 뷰 새로 고침의 상태를 볼 수 있습니다.

Delta Live Tables 이벤트 로그를 쿼리하여 구체화된 뷰의 새로 고침 기록을 볼 수도 있습니다. 구체화된 뷰의 새로 고침 기록을 보려면 을 참조하세요.

쿼리 기록을 사용하여 실행 모니터링

쿼리 기록 페이지를 사용하여 스트리밍 테이블 업데이트를 실행하는 데 사용되는 Delta Live Tables 파이프라인에서 제대로 수행되지 않는 쿼리 및 병목 상태를 식별하는 데 도움이 되는 쿼리 세부 정보 및 쿼리 프로필에 액세스할 수 있습니다. 쿼리 기록 및 쿼리 프로필에 사용할 수 있는 정보의 종류에 대한 개요는 쿼리 기록쿼리 프로필을 참조하세요.

Important

이 기능은 공개 미리 보기 상태입니다. 작업 영역 관리자는 미리 보기 페이지에서 이 기능을 사용하도록 설정할 수 있습니다 . Azure Databricks 미리 보기 관리를 참조하세요.

구체화된 뷰와 관련된 모든 문이 쿼리 기록에 표시됩니다. 드롭다운 필터를 사용하여 명령을 선택하고 관련 쿼리를 검사할 수 있습니다. 모든 CREATE 문 뒤에는 Delta Live Tables 파이프라인에서 비동기적으로 실행되는 REFRESH 문이 잇습니다. 이 문에는 REFRESH 일반적으로 성능 최적화에 대한 인사이트를 제공하는 자세한 쿼리 계획이 포함됩니다.

쿼리 기록 UI의 문에 액세스 REFRESH 하려면 다음 단계를 사용합니다.

  1. 왼쪽 사이드바를 클릭하여 기록 아이콘 쿼리 기록 UI를 엽니다.
  2. REFRESH 드롭다운 필터에서 확인란을 선택합니다.
  3. 쿼리 문 이름을 클릭하여 쿼리 기간 및 집계 메트릭과 같은 요약 세부 정보를 봅니다.
  4. 쿼리 프로필 보기를 클릭하여 쿼리 프로필을 엽니다. 쿼리 프로필 탐색에 대한 자세한 내용은 쿼리 프로필을 참조하세요.
  5. 필요에 따라 쿼리 원본 섹션의 링크를 사용하여 관련 쿼리 또는 파이프라인을 엽니다.

CREATE MATERIALIZED VIEW을 참조하십시오.

Delta Live Tables UI에서 새로 고침 상태 보기

기본적으로 구체화된 뷰를 관리하는 Delta Live Tables 파이프라인은 Delta Live Tables UI에 표시되지 않습니다. Delta Live Tables UI에서 파이프라인을 보려면 파이프라인의 파이프라인 세부 정보 페이지에 대한 링크에 직접 액세스해야 합니다. 링크에 액세스하려면

  • 문에서 반환된 테이블의 DESCRIBE EXTENDED 행에 표시된 링크를 복사하여 붙여넣습니다.
  • 구체화된 보기의 계보 탭에서 파이프라인을 클릭한 다음 파이프라인 링크를 클릭합니다.

Azure Databricks UI의 SQL 편집기를 사용하여 제출된 비동기 REFRESH 명령의 경우 결과 패널에 표시된 링크에 따라 새로 고침 상태를 볼 수 있습니다.

활성 새로 고침 중지

Delta Live Tables UI에서 활성 새로 고침을 중지하려면 파이프라인 세부 정보 페이지에서 중지를 클릭하여 파이프라인 업데이트를 중지합니다. 파이프라인 API에서 Databricks CLI 또는 POST /api/2.0/pipelines/{pipeline_id}/stop 작업을 사용하여 새로 고침을 중지할 수도 있습니다.

구체화된 뷰의 정의 업데이트

구체화된 뷰의 정의를 업데이트하려면 먼저 삭제한 다음 구체화된 뷰를 다시 만들어야 합니다.

구체화된 뷰를 삭제합니다.

참고 항목

구체화된 뷰를 삭제하는 명령을 제출하려면 구체화된 뷰의 소유자이거나 구체화된 뷰에 대한 MANAGE 권한이 있어야 합니다.

구체화된 뷰를 삭제하려면 DROP VIEW 문을 사용합니다. DROP 문을 제출하려면 Azure Databricks UI, Databricks SQL CLI 또는 Databricks SQL API에서 SQL 편집기를 사용할 수 있습니다. 다음 예제는 mv1 구체화된 뷰를 드롭합니다:

DROP MATERIALIZED VIEW mv1;

구체화된 뷰 설명

구체화된 뷰에 대한 열 및 데이터 형식을 검색하려면 DESCRIBE 문을 사용합니다. 구체화된 뷰의 소유자, 위치, 생성 시간 및 새로 고침 상태와 같은 열, 데이터 형식 및 메타데이터를 검색하려면 DESCRIBE EXTENDED사용합니다. DESCRIBE 문을 제출하려면 Azure Databricks UI, Databricks SQL CLI 또는 Databricks SQL API의 SQL 편집기를 사용합니다.

구체화된 뷰의 소유자 변경

메타스토어 관리자 및 작업 영역 관리자인 경우 구체화된 뷰의 소유자를 변경할 수 있습니다. 구체화된 뷰는 델타 라이브 테이블 파이프라인을 자동으로 만들고 사용하여 변경 내용을 처리합니다. 구체화된 뷰 소유자를 변경하려면 다음 단계를 사용합니다.

  • 구체화된 보기의 계보 탭에서 파이프라인을 클릭한 다음 파이프라인 링크를 클릭합니다.
  • 공유클릭합니다. 사용 권한 설정 대화 상자가 나타납니다.
  • 현재 소유자 이름 오른쪽에 있는 x 클릭하여 현재 소유자를 제거합니다.
  • 입력을 시작하여 사용 가능한 사용자 목록을 필터링합니다. 새 파이프라인 소유자여야 하는 사용자를 클릭합니다.
  • 저장을 클릭하여 변경 사항을 저장하고 대화 상자를 닫습니다.

파이프라인에 정의된 구체화된 뷰를 포함한 모든 파이프라인 자산은 새 파이프라인 소유자가 소유합니다. 이후의 모든 업데이트는 새 소유자의 ID를 사용하여 실행됩니다.

구체화된 뷰에 대한 액세스 제어

구체화된 뷰는 잠재적으로 프라이빗 데이터가 노출되지 않도록 하면서 데이터 공유를 지원하기 위해 다양한 액세스 제어를 지원합니다. 구체화된 뷰 소유자 또는 MANAGE 권한이 있는 사용자는 다른 사용자에게 SELECT 권한을 부여할 수 있습니다. 구체화된 뷰에 대한 SELECT 액세스 권한이 있는 사용자는 구체화된 뷰에서 참조하는 테이블에 SELECT 액세스할 필요가 없습니다. 이 액세스 제어를 사용하면 기본 데이터에 대한 액세스를 제어하면서 데이터 공유를 사용할 수 있습니다.

구체화된 뷰에 권한 부여

구체화된 뷰에 대한 액세스 권한을 부여하려면 GRANT 문을 사용합니다.

GRANT
  privilege_type [, privilege_type ] ...
  ON <mv_name> TO principal;

privilege_type은 다음과 같을 수 있습니다:

  • SELECT - 사용자가 구체화된 뷰를 SELECT로 지정할 수 있습니다.
  • REFRESH - 사용자가 구체화된 뷰를 REFRESH로 지정할 수 있습니다. 새로 고침은 소유자의 권한을 사용하여 실행됩니다.

다음 예제에서는 구체화된 뷰를 만들고 사용자에게 선택 및 새로 고침 권한을 부여합니다.

CREATE MATERIALIZED VIEW <mv_name> AS SELECT * FROM <base_table>;
GRANT SELECT ON <mv_name> TO user;
GRANT REFRESH ON <mv_name> TO user;

구체화된 뷰에서 권한 취소

물질화된 뷰에서 액세스 권한을 철회하려면 REVOKE 문을 사용합니다.

REVOKE
  privilege_type [, privilege_type ]
  ON <name> FROM principal;

구체화된 뷰 소유자 또는 구체화된 뷰에 SELECT 또는 MANAGE 권한이 부여된 다른 사용자로부터 기본 테이블의 SELECT 권한이 취소되거나 기본 테이블이 삭제된 경우에도 구체화된 뷰 소유자 또는 사용자에게 부여된 액세스 권한이 구체화된 뷰를 쿼리할 수 있습니다. 그러나 다음과 같은 동작이 발생합니다.

  • 구체화된 뷰 소유자 또는 구체화된 뷰에 대한 액세스 권한을 잃은 다른 사용자는 더 이상 해당 구체화된 뷰를 REFRESH 표시할 수 없으며, 해당 구체화된 뷰는 오래된 뷰가 됩니다.
  • 일정으로 자동화된 경우 다음 예약된 REFRESH는 실패하거나 실행되지 않습니다.

다음 예는 SELECT로부터 mv1 권한을 취소하는 예입니다:

REVOKE SELECT ON mv1 FROM user1;

변경 데이터 피드의 사용

특정 고급 사용 사례를 제외하고 구체화된 뷰 기본 테이블에는 변경 데이터 피드가 필요합니다. 기본 테이블에서 변경 데이터 피드를 사용하도록 설정하려면 다음 구문을 사용하여 delta.enableChangeDataFeed 테이블 속성을 설정합니다.

ALTER TABLE table1 SET TBLPROPERTIES (delta.enableChangeDataFeed = true);

구체화된 보기에 대한 새로 고침 기록 보기

현재 및 과거 새로 고침을 포함하여 구체화된 뷰에서 REFRESH 작업의 상태를 보려면 Delta Live Tables 이벤트 로그를 쿼리합니다.

SELECT
  *
FROM
  event_log(TABLE(<fully-qualified-table-name>))
WHERE
  event_type = "update_progress"
ORDER BY
  timestamp desc;

카탈로그 및 스키마를 포함하여 <fully-qualified-table-name>을 구체화된 뷰의 정규화된 이름으로 바꿉니다.

Delta Live Tables 이벤트 로그란 무엇인가?.

제한 사항

  • 컴퓨팅 및 작업 영역 요구 사항은 요구 사항을 참조 하세요.
  • 구체화된 뷰는 ID 열 또는 서로게이트 키를 지원하지 않습니다.
  • 구체화된 뷰가 NULL가능한 열에 대해 합계 집계를 사용하고 해당 열에 NULL 값만 남아 있는 경우 구체화된 뷰 결과 집계 값은 NULL대신 0입니다.
  • 구체화된 뷰에서는 변경 데이터 피드 를 읽을 수 없습니다.
  • 시간 이동 쿼리는 구체화된 뷰에서 지원되지 않습니다.
  • 구체화된 뷰를 지원하는 기본 파일에는 구체화된 뷰 정의에 표시되지 않는 업스트림 테이블의 데이터(개인 식별 가능한 정보 포함)가 포함될 수 있습니다. 이 데이터는 구체화된 뷰의 증분 새로 고침을 지원하기 위해 기본 스토리지에 자동으로 추가됩니다. 구체화된 뷰의 기본 파일은 구체화된 뷰 스키마의 일부가 아닌 업스트림 테이블의 데이터를 노출할 위험이 있으므로 Databricks는 신뢰할 수 없는 다운스트림 소비자와 기본 스토리지를 공유하지 않는 것이 좋습니다. 예를 들어 구체화된 뷰의 정의에 COUNT(DISTINCT field_a) 절이 포함되어 있다고 가정합니다. 구체화된 뷰 정의에 집계 COUNT DISTINCT 절만 포함되더라도 기본 파일에는 field_a실제 값 목록이 포함됩니다.