次の方法で共有


CREATE MATERIALIZED VIEW

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

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

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

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

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

具体化されたビューとストリーミング テーブルに対する作成操作と更新操作は、サーバーレスの Lakeflow Spark 宣言パイプラインを利用します。 カタログ エクスプローラーを使用して、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 |
    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 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

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

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

    • コメント view_comment

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

    • 既定の照合順序UTF8_BINARY

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

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

    • TBLPROPERTIES

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

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

    • schedule

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

      • スケジュール [ 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 と同じ意味です。

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

        重要

        TRIGGER ON UPDATE機能はベータ版です

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

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

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

        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 特権。
  • 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 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;

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