次の方法で共有


CREATE MATERIALIZED VIEW

適用対象:「はい」チェックマークがオン Databricks SQL

具体化されたビューは、事前計算済みの結果をクエリに使用できるビューであり、入力の変更を反映するように更新できます。 具体化されたビューが更新されるたびに、クエリ結果が再計算されてアップストリームのデータセットの変更が反映されます。 具体化されたすべてのビューは、ETL パイプラインによってサポートされます。 具体化されたビューは、手動で、またはスケジュールに従って更新できます。

手動更新を実行する方法の詳細については、「REFRESH (MATERIALIZED VIEW または STREAMING TABLE)を参照してください。

更新をスケジュールする方法の詳細については、「例の または ALTER MATERIALIZED VIEW」を参照してください。

具体化されたビューは、Pro または Serverless SQL ウェアハウスを使用するか、パイプライン内でのみ作成できます。

具体化されたビューとストリーミング テーブルに対する作成操作と更新操作は、サーバーレスの Lakeflow 宣言型パイプラインを利用します。 カタログ エクスプローラーを使用して、UI でバッキング パイプラインの詳細を表示できます。 「カタログ エクスプローラーとは」を参照してください。

構文

{ CREATE OR REPLACE MATERIALIZED VIEW | CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] }
  view_name
  [ column_list ]
  [ view_clauses ]
  AS query

column_list
   ( { column_name column_type column_properties } [, ...]
      [ , table_constraint ] [...])

   column_properties
      { NOT NULL | COMMENT column_comment | column_constraint | MASK clause } [ ... ]

view_clauses
  { PARTITIONED BY (col [, ...]) |
    CLUSTER BY clause |
    COMMENT view_comment |
    DEFAULT COLLATION UTF8_BINARY |
    TBLPROPERTIES clause |
    SCHEDULE [ REFRESH ] schedule_clause |
    WITH { ROW FILTER clause } } [...]

schedule_clause
  { EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS } |
    CRON cron_string [ AT TIME ZONE timezone_id ] }

パラメーター

  • 取り替える

    指定すると、ビューとその内容が既に存在する場合は置き換えられます。

  • 存在しない場合

    ビューが存在しない場合は作成します。 この名前のビューが既に存在する場合、CREATE MATERIALIZED VIEW ステートメントは無視されます。

    IF NOT EXISTSOR REPLACE のいずれか 1 つだけを指定できます。

  • view_name

    新しく作成されたビューの名前。 完全修飾のビュー名は一意にする必要があります。

  • column_list

    必要に応じて、ビューのクエリ結果内の列にラベルを付けます。 列の一覧を指定する場合は、列の別名の数がクエリ内の式の数と一致している必要があります。 列リストが指定されていない場合、別名はビューの本体から派生します。

    • column_name

      列名は一意である必要があり、かつクエリの出力列にマップされている必要があります。

    • 列タイプ

      列のデータ型を指定します。 Azure Databricks でサポートされているすべてのデータ型が、すべての具体化されたビューでサポートされているわけではありません。

    • column_comment

      列を記述する任意のSTRING リテラル。 このオプションは、column_type と共に指定する必要があります。 列の種類が指定されていない場合、列コメントはスキップされます。

    • column_constraint

      情報主キーまたは情報外部キーの制約を、具体化されたビューの列に追加します。 列の種類が指定されていない場合、列制約はスキップされます。

    • MASK 句

      重要

      この機能はパブリック プレビュー段階にあります。

      列マスク関数を追加して機密データを匿名化します。 その列の後続のすべてのクエリは、列の元の値の代わりに、その列に対してその関数を評価した結果を受け取ります。 これは、値を編集するかどうかを決定するために関数で呼び出し元ユーザーの ID またはグループ メンバーシップを検査できる、きめ細かいアクセス制御の目的に役立ちます。 列の種類が指定されていない場合、列マスクはスキップされます。

  • テーブル制約

    情報主キーまたは情報外部キーの制約を、具体化されたビューのテーブルに追加します。 列の種類が指定されていない場合、テーブル制約はスキップされます。

  • view_clauses

    必要に応じて、パーティション分割、コメント、ユーザー定義プロパティ、更新スケジュールを新しい具体化されたビューに対して指定します。 各サブ句は、1 回だけ指定できます。

    • パーティション分割基準

      テーブルをパーティション分割する基準となる、テーブルの列の一覧 (省略可能)。

      液体クラスタリングは、クラスタリング用の柔軟で最適化されたソリューションを提供します。 具体化されたビューにCLUSTER BYする代わりに、PARTITIONED BYを使用することを検討してください。

    • CLUSTER BY

      列のサブセットによってクラスター化する省略可能な句。 液体クラスタリングの詳細については、「テーブルに 液体クラスタリングを使用する」を参照してください。

      Delta Lake リキッド クラスタリングを PARTITIONED BY と組み合わせることはできません。

    • コメント view_comment

      テーブルについて説明する STRING リテラル。

    • 既定の照合順序UTF8_BINARY

      適用対象: Databricks Runtime 17.1 以降

      物理化ビューの既定の照合順序を UTF8_BINARY に強制設定します。 ビューが作成されるスキーマに UTF8_BINARY以外の既定の照合順序がある場合、この句は必須です。 具体化されたビューの既定の照合順序は、ビュー本文内の既定の照合順序として使用されます。

    • TBLPROPERTIES

      必要に応じて、1 つ以上のユーザー定義プロパティを設定します。

      この設定を使用して、このステートメントの実行に使用する Lakeflow 宣言型パイプライン ランタイム チャネルを指定します。 pipelines.channel プロパティの値を "PREVIEW" または "CURRENT" に設定します。 既定値は "CURRENT" です。 Lakeflow 宣言パイプライン チャネルの詳細については、「 Lakeflow 宣言型パイプライン ランタイム チャネル」を参照してください。

    • スケジュール [ REFRESH ] スケジュール条項

      • EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS }

        定期的に発生する更新をスケジュールするには、EVERY 構文を使用します。 EVERY 構文を指定した場合、ストリーミング テーブルまたは具体化されたビューは、指定した値 (HOURHOURSDAYDAYSWEEK、または WEEKS など) に基づく指定の間隔で定期的に更新されます。 次の表に、number に使用できる整数値を示します。

        時間単位 整数値
        HOUR or HOURS 1 <= H <= 72
        DAY or DAYS 1<= D<= 31
        WEEK or WEEKS 1 <= W <= 8

        含まれる時間単位の単数形と複数形は、意味的に同等です。

      • CRON cron_string [ AT TIME ZONE timezone_id ]

        quartz cron 値を使用して更新をスケジュールします。 有効な time_zone_values が受け入れられます。 AT TIME ZONE LOCAL はサポートされていません。

        AT TIME ZONE が存在しない場合は、セッション タイム ゾーンが使用されます。 AT TIME ZONE が存在せず、セッション タイム ゾーンも設定されていない場合は、エラーがスローされます。 SCHEDULE は、SCHEDULE REFRESH と同じ意味です。

    • WITH ROW FILTER 句

      重要

      この機能はパブリック プレビュー段階にあります。

      行フィルター関数をテーブルに追加します。 そのテーブルからの後続のすべてのクエリは、関数によってブール値 TRUE に評価される行のサブセットを受け取ります。 これは、特定の行をフィルター処理するかどうかを決定するために関数で呼び出し元ユーザーの ID またはグループ メンバーシップを検査できる、きめ細かいアクセス制御の目的に役立ちます。

  • AS クエリ

    ベース テーブルまたはその他のビューからビューを構築するクエリです。

必要なアクセス許可

具体化されたビュー (MV) を作成するユーザーは、MV の所有者であり、次のアクセス許可が必要です。

  • MV によって参照されているベース テーブルに対する SELECT 特権。
  • 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権。
  • MV のスキーマに対する CREATE MATERIALIZED VIEW 特権。

ユーザーが MV を更新できるようになるためには、次のものが必要です。

  • 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権。
  • MV の所有権または MV に対する REFRESH 特権。
  • MV の所有者は、MV によって参照されているベース テーブルに対する SELECT 特権を持っている必要があります。

ユーザーが MV のクエリを実行できるようになるためには、次のものが必要です。

  • 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権。
  • 具体化されたビューに対する SELECT 特権。

行フィルターと列マスク

重要

この機能はパブリック プレビュー段階にあります。

行フィルターを使用すると、テーブル スキャンで行がフェッチされるたびにフィルターとして適用される関数を指定できます。 これらのフィルターにより、後続のクエリでフィルター述語が true と評価される行のみが返されるようになります。

列マスクを使用すると、テーブル スキャンが行をフェッチするたびに列の値をマスクできます。 その列に関連するすべての今後のクエリは、列の元の値を置き換えて、列に対して関数を評価した結果を受け取ります。

行フィルターと列マスクの使用方法の詳細については、「 行フィルターと列マスク」を参照してください。

行フィルターと列マスクの管理

具体化されたビューに対する行フィルターと列マスクは、CREATE ステートメントを通じて追加する必要があります。

行動

  • 定義者として更新: REFRESH MATERIALIZED VIEW ステートメントが具体化されたビューを更新すると、行フィルター関数は定義者の権限 (テーブル所有者) で実行されます。 つまり、テーブルの更新では、具体化されたビューを作成したユーザーのセキュリティ コンテキストが使用されます。
  • クエリ: ほとんどのフィルターは定義者の権限で実行されますが、ユーザー コンテキスト ( CURRENT_USERIS_MEMBERなど) をチェックする関数は例外です。 これらの関数は呼び出し元として実行されます。 この方法では、現在のユーザーのコンテキストに基づいて、ユーザー固有のデータ セキュリティとアクセス制御が適用されます。
  • 行フィルターと列マスクを含むソース テーブルに対する具体化されたビューを作成する場合、具体化されたビューの更新は常に完全更新になります。 完全更新では、最新の定義を使用して、ソースで使用可能なすべてのデータが再処理されます。 これにより、ソース テーブルのセキュリティ ポリシーが最新のデータと定義に基づいて評価され、適用されるようになります。

監視

DESCRIBE EXTENDEDINFORMATION_SCHEMA、またはカタログ エクスプローラーを使用して、特定の具体化されたビューに適用される既存の行フィルターと列マスクを調べます。 この機能により、ユーザーは具体化されたビューに対するデータ アクセスと保護対策を監査および確認できます。

制限事項

  • NULL 許容列に対する sum 集計を含む具体化されたビューで、最後の NULL 非許容値がその列から削除され、その列に残っているのが NULL 値のみである場合、具体化されたビューの結果の集計値は、NULL ではなくゼロを返します。
  • 列参照に別名は必要ありません。 次の例のように、非列参照式には別名が必要です。
    • 許可: SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
    • 許可されない: SELECT col1, SUM(col2) FROM t GROUP BY col1
  • 有効なステートメントにするには、NOT NULLPRIMARY KEY と共に手動で指定する必要があります。
  • 具体化されたビューでは、ID 列や代理キーはサポートされていません。
  • 具体化されたビューでは、OPTIMIZE および VACUUM コマンドはサポートされていません。 メンテナンスは自動的に行われます。
  • 具体化されたビューでは、データ品質の制約を定義するための期待値はサポートされていません。

-- Create a materialized view if it doesn't exist
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create and schedule a materialized view to be refreshed every day.
-- Note: All columns in a GROUP BY need to be explicitly aliased
> CREATE MATERIALIZED VIEW daily_sales
  COMMENT 'Daily sales numbers'
  SCHEDULE EVERY 1 DAY
  AS SELECT date AS date, sum(sales) AS sumOfSales
       FROM table1
       GROUP BY date;

-- Sets the runtime channel to "PREVIEW"
> CREATE MATERIALIZED VIEW mv_preview
  TBLPROPERTIES(pipelines.channel = "PREVIEW")
  AS SELECT * FROM RANGE(10)

-- Create a materialized view with a table constraint
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies(
    member_id int NOT NULL,
    full_name string,
    movie_title string,
    CONSTRAINT movie_pk PRIMARY KEY(member_id)
  )
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create or replace the materialized view to remove the table constraint and add a partition
> CREATE OR REPLACE MATERIALIZED VIEW subscribed_movies
  PARTITIONED BY (member_id)
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create a materialized view with a row filter and a column mask
> CREATE MATERIALIZED VIEW masked_view (
    id int,
    name string,
    region string,
    ssn string MASK catalog.schema.ssn_mask_fn
  )
  WITH ROW FILTER catalog.schema.us_filter_fn ON (region)
  AS SELECT id, name, region, ssn
       FROM employees;