뷰의 개요

이 항목에서는 뷰를 이해하고 사용하기 위한 개념을 설명합니다.

이 항목의 내용:

뷰란 무엇입니까?

뷰를 사용하면 테이블과 같이 쿼리 결과에 액세스할 수 있습니다. 쿼리는 CREATE VIEW 문에서 지정됩니다.

뷰는 데이터 결합, 분리 및 보호 등의 다양한 용도로 사용됩니다. 예를 들어, 병원의 의사 및 회계사와 같은 다양한 유형의 직원 요구 사항을 충족하는 별도의 뷰를 생성하는 것이 가능합니다.

CREATE TABLE hospital_table (patient_id INTEGER,
                             patient_name VARCHAR, 
                             billing_address VARCHAR,
                             diagnosis VARCHAR, 
                             treatment VARCHAR,
                             cost NUMBER(10,2));
INSERT INTO hospital_table 
        (patient_ID, patient_name, billing_address, diagnosis, treatment, cost) 
    VALUES
        (1, 'Mark Knopfler', '1982 Telegraph Road', 'Industrial Disease', 
            'a week of peace and quiet', 2000.00),
        (2, 'Guido van Rossum', '37 Florida St.', 'python bite', 'anti-venom', 
            70000.00)
        ;
Copy
CREATE VIEW doctor_view AS
    SELECT patient_ID, patient_name, diagnosis, treatment FROM hospital_table;

CREATE VIEW accountant_view AS
    SELECT patient_ID, patient_name, billing_address, cost FROM hospital_table;
Copy

뷰는 테이블을 사용할 수 있는 거의 모든 위치(조인, 하위 쿼리 등)에서 사용할 수 있습니다. 예를 들어, 위에서 생성한 뷰를 사용하면:

  • 각 환자에 대한 모든 의료 문제 유형을 표시할 수 있습니다.

    SELECT DISTINCT diagnosis FROM doctor_view;
    +--------------------+
    | DIAGNOSIS          |
    |--------------------|
    | Industrial Disease |
    | python bite        |
    +--------------------+
    
    Copy
  • 각 치료 비용을 표시(특정 환자에 대한 개인 식별 정보는 표시하지 않음)할 수 있습니다.

    SELECT treatment, cost 
        FROM doctor_view AS dv, accountant_view AS av
        WHERE av.patient_ID = dv.patient_ID;
    +---------------------------+----------+
    | TREATMENT                 |     COST |
    |---------------------------+----------|
    | a week of peace and quiet |  2000.00 |
    | anti-venom                | 70000.00 |
    +---------------------------+----------+
    
    Copy

CREATE VIEW 명령에서는 정규화, 부분 정규화 또는 정규화되지 않은 테이블 이름을 사용할 수 있습니다. 예:

CREATE VIEW v1 AS SELECT ... FROM my_database.my_schema.my_table;

CREATE VIEW v1 AS SELECT ... FROM my_schema.my_table;

CREATE VIEW v1 AS SELECT ... FROM my_table;
Copy

스키마가 지정되지 않은 경우, Snowflake는 테이블이 뷰와 동일한 스키마에 있는 것으로 가정합니다. (테이블이 활성 스키마에 있는 것으로 가정하면 뷰가 다른 시간에 다른 테이블을 참조할 수 있음)

뷰의 타입

Snowflake에서 지원하는 두 가지 타입의 뷰는 다음과 같습니다.

  • 구체화되지 않은 뷰(일반적으로 단순히 《뷰》라고 칭함)

  • 구체화된 뷰.

구체화되지 않은 뷰

일반적으로 《뷰》라는 용어는 모든 타입의 뷰를 나타내지만, 여기에서는 구체화되지 않은 뷰를 나타내기 위해 사용됩니다.

기본적으로 뷰는 쿼리의 명명된 정의입니다. 구체화되지 않은 뷰의 결과는 쿼리에서 뷰가 참조되는 시점에 쿼리를 실행하여 생성됩니다. 향후에 사용하기 위한 용도로 결과가 저장되지 않습니다. 구체화된 뷰를 사용할 때보다 성능이 느립니다. 구체화되지 않은 뷰는 가장 일반적인 타입의 뷰입니다.

유효한 결과를 반환하는 쿼리식을 사용하여 구체화되지 않은 뷰를 생성할 수 있으며, 그러한 예는 다음과 같습니다.

  • 테이블의 일부(또는 모든) 열 선택.

  • 테이블 열에서 특정 데이터 범위 선택.

  • 2개 이상 테이블에서 데이터 조인.

구체화된 뷰

구체화된 뷰는 일종의 뷰처럼 이름이 지정되지만, 여러 측면에서 테이블처럼 동작합니다. 구체화된 뷰의 결과는 결과가 테이블인 것처럼 저장됩니다. 이를 통해 더 빠르게 액세스할 수 있지만 저장소 공간과 적극적인 유지 관리가 필요하며, 이러한 두 가지 모두에서 추가 비용이 발생합니다.

또한, 구체화된 뷰의 경우 구체화되지 않은 뷰에는 적용되지 않는 몇 가지 제한 사항이 있습니다.

자세한 내용은 구체화된 뷰 작업하기 섹션을 참조하십시오.

보안 뷰

구체화되지 않은 뷰 및 구체화된 뷰 모두 보안 뷰로 정의할 수 있습니다. 보안 뷰의 경우 향상된 데이터 개인 정보 보호 및 데이터 공유 등과 같이 표준 뷰와 비교하여 여러 이점이 있지만, 고려해야 할 몇 가지 성능 영향도 있습니다.

자세한 내용은 보안 뷰 관련 작업하기 섹션을 참조하십시오.

재귀 뷰(구체화되지 않은 뷰만 해당)

구체화되지 않은 뷰는 재귀적(즉, 뷰가 자체를 참조할 수 있음)일 수 있습니다.

뷰에서 재귀 사용은 재귀 CTEs 에서 재귀를 사용하는 것과 유사합니다. 사실, 재귀 CTE를 사용하여 뷰를 정의할 수 있습니다. 예:

CREATE VIEW employee_hierarchy (title, employee_ID, manager_ID, "MGR_EMP_ID (SHOULD BE SAME)", "MGR TITLE") AS (
   WITH RECURSIVE employee_hierarchy_cte (title, employee_ID, manager_ID, "MGR_EMP_ID (SHOULD BE SAME)", "MGR TITLE") AS (
      -- Start at the top of the hierarchy ...
      SELECT title, employee_ID, manager_ID, NULL AS "MGR_EMP_ID (SHOULD BE SAME)", 'President' AS "MGR TITLE"
        FROM employees
        WHERE title = 'President'
      UNION ALL
      -- ... and work our way down one level at a time.
      SELECT employees.title, 
             employees.employee_ID, 
             employees.manager_ID, 
             employee_hierarchy_cte.employee_id AS "MGR_EMP_ID (SHOULD BE SAME)", 
             employee_hierarchy_cte.title AS "MGR TITLE"
        FROM employees INNER JOIN employee_hierarchy_cte
       WHERE employee_hierarchy_cte.employee_ID = employees.manager_ID
   )
   SELECT * 
      FROM employee_hierarchy_cte
);
Copy

재귀 CTE를 사용하는 대신, RECURSIVE 키워드를 사용하여 재귀 뷰를 생성할 수 있으며 그러한 예는 다음과 같습니다.

CREATE RECURSIVE VIEW employee_hierarchy_02 (title, employee_ID, manager_ID, "MGR_EMP_ID (SHOULD BE SAME)", "MGR TITLE") AS (
      -- Start at the top of the hierarchy ...
      SELECT title, employee_ID, manager_ID, NULL AS "MGR_EMP_ID (SHOULD BE SAME)", 'President' AS "MGR TITLE"
        FROM employees
        WHERE title = 'President'
      UNION ALL
      -- ... and work our way down one level at a time.
      SELECT employees.title, 
             employees.employee_ID, 
             employees.manager_ID, 
             employee_hierarchy_02.employee_id AS "MGR_EMP_ID (SHOULD BE SAME)", 
             employee_hierarchy_02.title AS "MGR TITLE"
        FROM employees INNER JOIN employee_hierarchy_02
        WHERE employee_hierarchy_02.employee_ID = employees.manager_ID
);
Copy

예를 포함한 자세한 내용은 CREATE VIEW 섹션을 참조하십시오.

뷰의 장점

뷰를 사용하면 더 많은 모듈형 코드 작성 가능

뷰를 사용하면 명확성이 향상된 더 많은 모듈형 SQL 코드를 작성할 수 있습니다. 예를 들어, 모든 직원에 대한 정보가 포함된 테이블이 병원 데이터베이스에 있다고 가정해 보겠습니다. 이러한 경우 의료진 관련 정보만 또는 유지 관리 직원 관련 정보만 편리하게 추출할 수 있도록 뷰를 생성할 수 있습니다. 뷰의 계층 구조를 생성하는 것도 가능합니다.

예를 들어, 의사에 대한 뷰 및 간호사에 대한 뷰를 생성한 후 의사 뷰 및 간호사 뷰를 참조하여 medical_staff 뷰를 생성할 수 있습니다.

CREATE TABLE employees (id INTEGER, title VARCHAR);
INSERT INTO employees (id, title) VALUES
    (1, 'doctor'),
    (2, 'nurse'),
    (3, 'janitor')
    ;

CREATE VIEW doctors as SELECT * FROM employees WHERE title = 'doctor';
CREATE VIEW nurses as SELECT * FROM employees WHERE title = 'nurse';
CREATE VIEW medical_staff AS
    SELECT * FROM doctors
    UNION
    SELECT * FROM nurses
    ;
Copy
SELECT * 
    FROM medical_staff
    ORDER BY id;
+----+--------+
| ID | TITLE  |
|----+--------|
|  1 | doctor |
|  2 | nurse  |
+----+--------+
Copy

대부분의 경우 크고 이해하기 어려운 쿼리 1개를 작성하는 대신 쿼리를 더 작은 조각으로 분해하고 각 조각에 대한 뷰를 생성할 수 있습니다. 이를 통해 코드를 더 쉽게 이해할 수 있을 뿐만 아니라 전체 쿼리가 아닌 한 번에 1개의 뷰를 디버그할 수 있으므로 코드를 더 편리하게 디버그할 수 있는 경우가 많습니다.

뷰는 여러 쿼리에서 참조할 수 있으므로 뷰를 통해 코드 재사용성을 향상할 수 있습니다.

테이블의 하위 세트에 액세스하기 위한 권한을 부여하는 뷰

뷰를 사용하면 테이블에 있는 일부 데이터에만 액세스 권한을 부여할 수 있습니다. 예를 들어, 의료 환자 기록 테이블이 있다고 가정해 보겠습니다. 의료진은 모든 의료 정보(예: 진단)에는 액세스할 수 있어야 하지만, 금융 정보(예: 환자의 신용 카드 번호)에는 액세스할 수 없어야 합니다. 회계 직원은 환자에게 제공된 각 처방전 비용과 같은 청구 관련 정보에 액세스할 수 있어야 하지만, 정신 건강 상태 진단과 같은 개인 의료 데이터에는 액세스할 수 없어야 합니다. 이러한 경우에는 각각의 역할이 본인의 업무를 수행하기 위해 필요한 정보만 볼 수 있도록 의료 인력용 및 청구 인력용의 개별 뷰 2개를 생성할 수 있습니다. 뷰를 사용하면 특정 뷰에 대한 권한을 특정 역할에 부여할 수 있으므로, 권한을 부여 받는 역할에 뷰의 기본이 되는 테이블에 대한 권한이 없어도 됩니다.

의료 예시에서,

  • 의료 인력은 데이터 테이블에 대한 권한은 갖지 않지만, 진단 및 치료를 보여주는 뷰에 대한 권한을 갖습니다.

  • 회계 인력은 데이터 테이블에 대한 권한을 갖지 않지만, 청구 정보를 표시하는 뷰에 대한 권한을 갖습니다.

추가적인 보안과 관련하여 Snowflake는 뷰를 보안으로 정의하는 기능을 지원합니다. 보안 뷰에 대한 자세한 내용은 보안 뷰 관련 작업하기 을 참조하십시오.

성능을 향상할 수 있는 구체화된 뷰

구체화된 뷰는 성능을 향상하도록 설계되었습니다. 구체화된 뷰에는 테이블에 있는 데이터 하위 세트의 복사본이 포함됩니다. 테이블 및 구체화된 뷰의 데이터 양에 따라 테이블을 스캔하는 것보다 구체화된 뷰를 스캔하는 것이 훨씬 빠르게 수행될 수 있습니다. 구체화된 뷰에서는 클러스터링도 지원되며, 동일한 데이터에 대해 여러 개의 구체화된 뷰를 생성할 수 있으므로, 서로 다른 열에 클러스터링된 각 구체화된 뷰를 사용하여 해당 쿼리에 가장 적합한 클러스터링을 통해 뷰에서 서로 다른 쿼리를 실행할 수 있습니다.

자세한 내용은 구체화된 뷰 작업하기 섹션을 참조하십시오.

뷰에 대한 제한 사항

  • 뷰 생성과 관련된 제한 사항 및 사용법 노트는 CREATE VIEW 를 참조하십시오.

  • 뷰의 정의는 업데이트할 수 없습니다(즉, ALTER VIEW 또는 ALTER MATERIALIZED VIEW 를 사용하여 뷰의 정의를 변경할 수 없음). 뷰 정의를 변경하려면, 새로운 정의를 사용하여 뷰를 다시 생성해야 합니다.

  • 뷰는 읽기 전용(즉, 뷰에서 DML 명령을 직접 실행할 수 없음)입니다. 그러나 기본 테이블을 업데이트하는 DML 문의 하위 쿼리에서 뷰를 사용할 수 있습니다. 예:

    DELETE FROM hospital_table 
        WHERE cost > (SELECT AVG(cost) FROM accountant_view);
    
    Copy
  • 테이블에 대한 변경 사항은 해당 테이블에 생성된 뷰에 자동으로 전파되지 않습니다. 예를 들어, 테이블의 열을 삭제하면 해당 테이블의 뷰가 무효화됩니다.

  • 뷰 정의가 CURRENT_DATABASE 또는 CURRENT_SCHEMA 함수를 호출할 경우 함수는 USE <오브젝트> 명령으로 지정하거나 Snowsight 의 컨텍스트 선택기로 선택하는 세션에 대한 데이터베이스나 스키마가 아니라 뷰가 포함된 데이터베이스나 스키마로 평가합니다.