ビューの概要

このトピックでは、ビューを理解して使用するための概念について説明します。

このトピックの内容:

ビューとは

ビューを使用すると、クエリの結果がテーブルであるかのようにアクセスできます。クエリは 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種類のビューをサポートしています。

  • 非マテリアライズドビュー(通常、単に「ビュー」と呼ばれます)。

  • マテリアライズドビュー。

非実体化ビュー

「ビュー」という用語は、一般的にすべてのタイプのビューを指します。ただし、ここでは非マテリアライズドビューを指すためにこの用語を使用します。

ビューは基本的に、クエリの名前付き定義です。非マテリアライズドビューの結果は、ビューがクエリで参照されているときにクエリを実行することによって作成されます。結果は将来の使用のために保存されません。マテリアライズドビューよりもパフォーマンスが遅くなります。非マテリアライズドビューは、最も一般的なタイプのビューです。

有効な結果を返すクエリ式を使用して、次のような非マテリアライズドビューを作成できます。

  • テーブル内の一部(またはすべて)の列を選択します。

  • テーブル列の特定の範囲のデータを選択します。

  • 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 コードを記述できます。例えば、病院のデータベースにすべての従業員に関する情報をリストするテーブルがあるとします。ビューを作成して、医療スタッフのみまたはメンテナンススタッフのみに関する情報を簡単に抽出できるようにすることができます。ビューの階層を作成することもできます。

たとえば、医師用のビューと看護師用のビューを1つずつ作成してから、医師ビューと看護師ビューを参照して 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つのビューをデバッグできるため、コードのデバッグも容易になります。

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 のコンテキストセレクターで選択したセッションのデータベースまたはスキーマではなく、ビューが含まれるデータベースまたはスキーマに対して評価されます。