ビューの概要

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

このトピックの内容:

ビューとは何ですか?

ビューを使用すると、クエリの結果にテーブルのようにアクセスできます。クエリは 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)
        ;
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;

ビューは、テーブルを使用できるほぼすべての場所で使用できます(結合やサブクエリなど)。例えば、上記で作成したビューを使用します。

  • 各患者のすべての種類の医学的問題を表示します。

    SELECT DISTINCT diagnosis FROM doctor_view;
    +--------------------+
    | DIAGNOSIS          |
    |--------------------|
    | Industrial Disease |
    | python bite        |
    +--------------------+
    
  • 各治療の費用を表示します(特定の患者に関する個人を特定する情報は非表示)。

    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 |
    +---------------------------+----------+
    

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;

スキーマが指定されていない場合、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
);

再帰的な 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
);

例などの詳細については、 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
    ;
SELECT * 
    FROM medical_staff
    ORDER BY id;
+----+--------+
| ID | TITLE  |
|----+--------|
|  1 | doctor |
|  2 | nurse  |
+----+--------+

多くの場合、1つの大きくて理解しにくいクエリを記述するのではなく、クエリを小さな断片に分解し、それらの断片ごとにビューを作成できます。これにより、コードが理解しやすくなるだけでなく、多くの場合、クエリ全体ではなく、一度に1つのビューをデバッグできるため、コードのデバッグも容易になります。

1つのビューをさまざまなクエリで参照できるため、ビューはコードの再利用を促進します。

ビューはテーブルのサブセットへのアクセスを許可します

ビューを使用すると、テーブル内のデータの一部のみへのアクセスを許可できます。例えば、医療患者の記録のテーブルがあるとします。医療スタッフは、すべての医療情報(診断など)にはアクセスできますが、財務情報(患者のクレジットカード番号など)にはアクセスできません。経理スタッフは、患者に与えられた各処方の費用などの請求関連情報にアクセスできる必要がありますが、精神衛生状態の診断などの個人の医療データにはアクセスできません。医療スタッフ用と請求スタッフ用の2つの個別のビューを作成して、それぞれの役割がジョブの実行に必要な情報のみを表示できるようにすることができます。特定のビューに対する権限を特定のロールに付与することができるため、ビューはこれを許可します。権限受領者ロールは、ビューの基礎となる表に対する権限を持ちません。

医療の例では:

  • 医療スタッフにはデータテーブルに対する権限はありませんが、診断と治療を示すビューに対する権限はあります。

  • 経理スタッフはデータテーブルに対する権限を持ちませんが、請求情報を表示するビューに対する権限は持ちます。

セキュリティを強化するために、Snowflakeは、ビューをセキュアとして定義することをサポートしています。セキュアビューの詳細については、 安全なビューの使用 をご参照ください。

ビューはパフォーマンスを改善できる

状況によっては、ビューによってパフォーマンスが向上する場合があります。

非マテリアライズドビュー

クエリが非マテリアライズドビューを参照する場合、Snowflakeクエリオプティマイザーは内部最適化を使用してビューとクエリを一緒に処理し、個別に評価する場合よりも効率的にビューを評価できる場合があります。

マテリアライズドビュー

マテリアライズドビューは、パフォーマンスを向上させるように設計されています。マテリアライズドビューには、テーブル内のデータのサブセットのコピーが含まれます。テーブルおよびマテリアライズドビューのデータ量によっては、マテリアライズドビューのスキャンはテーブルのスキャンよりもはるかに高速です。マテリアライズドビューもクラスタリングをサポートします。同じデータ上に複数のマテリアライズドビューを作成できます。各マテリアライズドビューは異なる列にクラスタ化されるため、そのクエリに最適なクラスタリングで異なるクエリをそれぞれビューで実行できます。

ビューの制限

  • ビューの定義は更新できません(つまり、 ALTER VIEW または ALTER MATERIALIZED VIEW を使用してビューの定義を変更することはできません)。ビュー定義を変更するには、新しい定義でビューを再作成する必要があります。

  • テーブルへの変更は、そのテーブルで作成されたビューに自動的に反映されません。例えば、テーブルに列をドロップすると、そのテーブルのビューが無効になる場合があります。

  • ビューは読み取り専用です(つまり、ビューで DML コマンドを直接実行することはできません)。ただし、基になるベーステーブルを更新する DML ステートメント内のサブクエリでビューを使用できます。例:

    DELETE FROM hospital_table 
        WHERE cost > (SELECT AVG(cost) FROM accountant_view);