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 } [, ...]
      [ CONSTRAINT expectation_name EXPECT (expectation_expr)
        [ ON VIOLATION { FAIL UPDATE | DROP ROW } ] ] [, ...]
      [ , table_constraint ] [...])

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

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

schedule
  { SCHEDULE [ REFRESH ] schedule_clause |
    TRIGGER ON UPDATE [ AT MOST EVERY trigger_interval ] }

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

パラメーター

  • 取り替える

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

  • 存在しない場合

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

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

  • view_name

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

  • column_list

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

    • column_name

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

    • 列タイプ

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

    • column_comment

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

    • column_constraint

      情報主キーまたは情報外部キーの制約を、マテリアライズド ビューの列に追加します。 列の種類が指定されていない場合、列制約はスキップされます。

    • MASK 句

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

    • CONSTRAINT expectation_name EXPECT (expectation_expr) [ 違反時 { FAIL UPDATE | ROWを削除 } ]

      具体化されたビューにデータ品質の期待値を追加します。 これらのデータ品質の期待値は、時間の経過と同時に追跡し、具体化されたビューの イベント ログを通じてアクセスできます。 FAIL UPDATE期待値により、具体化されたビューの作成と更新の両方で処理が失敗します。 DROP ROW 期待値が満たされない場合、行全体が削除されます。

      ON VIOLATIONを省略すると、既定のwarnアクションが使用されます。 違反した行は保持され、違反の数はイベント ログの ExpectationMetrics オブジェクトに記録されます。

      expectation_expr は、リテラル、具体化されたビュー内の列識別子、および決定論的な組み込みの SQL 関数または演算子で構成できます。ただし、次の点を除きます。

      また expr には、サブクエリを含めることはできません。

      期待値を含む定義を持つ具現化された見解は、多くの場合、漸進的な刷新を支えます。 完全なリフレッシュが必要な特定のケースについては、「 Materialized View Incremental Refreshのサポート」を参照してください。

  • テーブル制約

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

  • view_clauses

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

    • DELTA の使用

      データ形式を指定します。 既定値は DELTA です。

      この句は省略可能です。

    • ICEBERG の使用

      外部 Iceberg リーダーと互換性のある具体化されたビューを作成します。 具体化されたビューを作成したら、 REPAIR TABLE <mv_name> SYNC METADATA実行します。 具体化されたビューは、外部 Iceberg リーダーの読み取り専用です。 「外部 Iceberg リーダーと互換性のある具体化されたビューを作成する」を参照してください。

      Important

      管理された Iceberg 具体化されたビューは パブリック プレビュー段階です。 この機能を有効にするには、Databricks アカウント チームにお問い合わせください。

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

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

      注

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

    • CLUSTER BY

      列のサブセットによってクラスター化する省略可能な句。 CLUSTER BY AUTOで自動液体クラスタリングを使用し、Databricks はクエリのパフォーマンスを最適化するためにクラスタリング キーをインテリジェントに選択します。 表に液体クラスタリングを使用するを参照してください。

      液体クラスタリングを PARTITIONED BYと組み合わせることはできません。

    • コメント view_comment

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

    • 既定の照合順序UTF8_BINARY

      適用対象:はい Databricks SQL チェックが Databricks Runtime 17.1 以降" とマークされているチェック

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

    • TBLPROPERTIES

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

      かつてPREVIEWやCURRENTランタイムチャンネルを選択するために使われていたこのpipelines.channelプロパティは、単独のマテリアル化ビューにはもはやサポートされておらず、効果はありません。 スタンドアロンのマテリアライズビューは常に最新のDatabricks SQLランタイムバージョン上で動作します。 既存の定義にこの性質が含まれている場合は、安全に無視されます。

    • REFRESH ポリシー

      オプションとして、マテリアライズされたビューのリフレッシュポリシーを設定します。

    • schedule

      スケジュールには、 SCHEDULE ステートメントまたは TRIGGER ステートメントのいずれかを指定できます。

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

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

          定期的に発生する更新をスケジュールするには、EVERY 構文を使用します。 EVERY 構文を指定した場合、ストリーミング テーブルまたはマテリアライズド ビューは、指定した値 (HOUR、HOURS、DAY、DAYS、WEEK、または 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 はサポートされていません。

          cron 式では、6 つのスペースで区切られたフィールドが次の順序で使用されます: seconds minutes hours day-of-month month day-of-week。 ?またはday-of-monthにday-of-weekを使用して、未指定のままにします。

          たとえば、 SCHEDULE CRON '0 0 0 * * ?' AT TIME ZONE 'UTC' は毎日午前 0 時 (UTC) に更新されます。

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

      • トリガーオン UPDATE [ 最大ですべてのtrigger_interval ]

        必要に応じて、アップストリーム データ ソースが更新されたときに更新するようにテーブルを設定します (最大 1 分ごとに)。 AT MOST EVERYの値を設定して、更新の間に少なくとも最小限の時間を必要とします。

        アップストリーム データ ソースは、外部またはマネージド Delta テーブル (マテリアライズド ビューやストリーミング テーブルを含む) か、依存関係がサポートされているテーブルの種類に制限されているマネージド ビューである必要があります。 OpenSharing 共有テーブルは、アップストリーム ソースとしてサポートされていません。

        ファイル イベントを有効にすると、トリガーのパフォーマンスが向上し、トリガーの更新の制限の一部が増える可能性があります。

        trigger_intervalは、少なくとも 1 分の INTERVAL ステートメントです。

        TRIGGER ON UPDATE には次の制限があります

        • TRIGGER ON UPDATEを使用する場合、具体化ビューあたり最大10個のアップストリームデータソースが許可されていません。
        • TRIGGER ON UPDATEでは、最大 1,000 個のストリーミング テーブルまたはマテリアライズド ビューを指定できます。
        • AT MOST EVERY句の既定値は 1 分で、1 分未満にすることはできません。
    • WITH ROW FILTER 句

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

  • AS クエリ

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

必要なアクセス許可

マテリアライズド ビュー (MV) を作成するユーザーは、MV の所有者であり、次のアクセス許可が必要です。

  • MV によって参照されているベース テーブルに対する SELECT 特権。
  • 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権。
  • CREATE MATERIALIZED VIEW マテリアライズド ビューを含むスキーマに対する権限。
  • 従来の発行モードを使用するパイプラインには、CREATE TABLE特権も必要です。

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

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

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

  • 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権。
  • マテリアライズド ビューに対する SELECT 特権。

行フィルターと列マスク

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

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

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

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

マテリアライズド ビューに対する行フィルターと列マスクは、CREATE ステートメントを通じて追加する必要があります。

行動

  • 定義者として更新: REFRESH MATERIALIZED VIEW ステートメントがマテリアライズド ビューを更新すると、行フィルター関数は定義者の権限 (テーブル所有者) で実行されます。 つまり、テーブルの更新では、マテリアライズド ビューを作成したユーザーのセキュリティ コンテキストが使用されます。
  • クエリ: ほとんどのフィルターは定義者の権限で実行されますが、ユーザー コンテキスト ( CURRENT_USER や IS_MEMBERなど) をチェックする関数は例外です。 これらの関数は呼び出し元として実行されます。 この方法では、現在のユーザーのコンテキストに基づいて、ユーザー固有のデータ セキュリティとアクセス制御が適用されます。

監視

DESCRIBE EXTENDED、INFORMATION_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 NULL を PRIMARY KEY と共に手動で指定する必要があります。
  • マテリアライズド ビューでは、ID 列や代理キーはサポートされていません。
  • マテリアライズド ビューでは、OPTIMIZE および VACUUM コマンドはサポートされていません。 メンテナンスは自動的に行われます。
  • 具体化されたビューは、 CLONEをサポートしていません。 具体化されたビューを、ディープ クローンまたはシャロー クローンのソースまたはターゲットとして使用することはできません。 「Azure Databricksでテーブルを複製する」を参照してください。

例

-- 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 whenever the
-- upstream data is updated
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies
  TRIGGER ON UPDATE
  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;

-- Create and schedule a materialized view using a cron expression.
-- The cron expression uses six space-separated fields:
-- seconds minutes hours day-of-month month day-of-week
-- Use '?' for day-of-month or day-of-week to leave it unspecified.
-- This example refreshes daily at midnight UTC.
> CREATE MATERIALIZED VIEW daily_revenue
  SCHEDULE CRON '0 0 0 * * ?' AT TIME ZONE 'UTC'
  AS SELECT date AS date, sum(revenue) AS totalRevenue
       FROM orders
       GROUP BY date;

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