Databricks SQL でのマテリアライズドビューの使用

プレビュー

この機能はパブリック プレビュー段階です。 アクセスにサインアップするには、 このフォームに記入してください

この記事では、Databricks SQL でマテリアライズドビューを作成して使用し、パフォーマンスを向上させ、データ処理と分析のワークロードのコストを削減する方法について説明します。

マテリアライズドビューとは何ですか?

Databricks SQL では、具体化されたビューは、ユーザーがソース テーブル内の最新バージョンのデータに基づいて結果を事前に計算できるようにする Unity Catalog マネージド テーブルです。 Databricks の具体化されたビューは、具体化されたビューがクエリのときに常に結果を更新するのではなく、返される結果が具体化されたビューが最後に更新されたときのデータの状態を反映するため、他の実装とは異なります。 具体化されたビューを手動で更新したり、更新をスケジュールしたりできます。

具体化されたビューは、抽出、変換、読み込み (ETL) 処理などのデータ処理ワークロードに強力です。 具体化されたビューは、コンプライアンス、修正、集計、または一般的なチェンジデータキャプチャ (CDC) のデータを処理するためのシンプルで宣言的な方法を提供します。 マテリアライズドビューは、低速なクエリーと頻繁に使用される計算を事前に計算することで、コストを削減し、クエリーの待機時間を改善します。 マテリアライズドビューでは、ベーステーブルのクリーニング、エンリッチメント、および非正規化による使いやすい変換も可能です。 具体化されたビューは、場合によってはベーステーブルから変更を段階的にコンピュートできるため、簡素化されたエンドユーザーエクスペリエンスを提供しながらコストを削減できます。

マテリアライズドビューは、 Delta Live Tables のリリースにより、Databricksデータインテリジェンスプラットフォームで最初にサポートされました。 Databricks SQL ウェアハウスでマテリアライズドビューを作成すると、具体化されたビューの更新を処理するための Delta Live Tables パイプラインが作成されます。 更新操作の状態は、Delta Live Tables UI、Delta Live Tables API、または Delta Live Tables CLI で監視できます。 マテリアライズドビュー更新のステータスの表示を参照してください。

要件

  • Unity カタログ対応の Databricks SQLウェアハウスを使用して、マテリアライズドビューを作成および更新する必要があります。

Databricks SQL で具体化されたビューを使用する場合の制限については、「 制限事項」を参照してください。

マテリアライズドビュー を作成する

実体化ビュー (Materialized View) を作成するには、 CREATE MATERIALIZED VIEW ステートメントを使用します。 Databricks SQL リファレンスの「CREATE MATERIALIZED VIEW」を参照してください。 create ステートメントを送信するには、Databricks UI のSQL エディターDatabricks SQL CLI 、またはDatabricks SQL APIを使用します。

マテリアライズドビューを作成するユーザーはマテリアライズドビューの所有者であり、次の権限が必要です。

  • SELECT マテリアライズドビューによって参照されるベーステーブルに対する権限。

  • USE CATALOG マテリアライズドビューのソース表を含むカタログおよびスキーマに対する USE SCHEMA 権限。

  • USE CATALOG マテリアライズドビューのターゲットカタログとスキーマに対する USE SCHEMA 権限。

  • CREATE TABLE マテリアライズドビューを含むスキーマに対する CREATE MATERIALIZED VIEW 権限。

次の例では、ベーステーブル base_table1からマテリアライズドビュー mv1 を作成します。

CREATE MATERIALIZED VIEW mv1
AS SELECT
  date, sum(sales) AS sum_of_sales
FROM
  table1
GROUP BY
  date;

具体化されたビューはどのように作成されますか?

Databricks SQL 具体化されたビュー CREATE 操作では、Databricks SQLウェアハウスを使用して、具体化されたビューにデータを作成して読み込みます。 具体化されたビューの作成は Databricks SQLウェアハウス の同期操作であるため、具体化されたビューが作成され、最初のデータの読み込みが完了するまで、 CREATE MATERIALIZED VIEW コマンドはブロックします。 Delta Live Tables パイプラインは、すべての Databricks SQL 具体化されたビューに対して自動的に作成されます。具体化されたビュー が更新されると、更新を処理するために Delta Live Tables パイプラインの更新が開始されます。

外部システムからデータを読み込む

Databricks では、サポートされているデータソースに対してレイクハウスフェデレーションを使用して外部 データを読み込むことを推奨しています。 レイクハウスフェデレーションでサポートされていないソースからのデータの読み込みについては、「 データ形式のオプション」を参照してください。

具体化されたビュー を更新する

REFRESHオペレーションは、マテリアライズド ビューを更新して、ベース テーブルへの最新の変更を反映します。 マテリアライズド ビューを更新するには、 REFRESH MATERIALIZED VIEWステートメントを使用します。 Databricks SQL リファレンスの「更新 (MATERIALIZED VIEW および STREAMING TABLE)」を参照してください。 更新ステートメントを送信するには、Databricks UI のSQL エディターDatabricks SQL CLI 、またはDatabricks SQL APIを使用します。

所有者のみがマテリアライズドビュー REFRESH できます。

次の例では、 mv1 マテリアライズドビューを更新します。

REFRESH MATERIALIZED VIEW mv1;

Databricks SQL 具体化されたビューはどのように更新されますか?

データブリック SQL 具体化されたビューでは、更新操作に Delta Live Tables が使用されます。 具体化されたビューが更新されると、具体化されたビューを管理する Delta Live Tables パイプライン の更新 が開始され、更新が処理されます。

具体化されたビューの更新Databricks SQL 非同期です。具体化されたビューの更新が開始されると、Delta Live Tables クラスターでバックグラウンドジョブが開始され、データの読み込みが完了する直前にコマンドが返されます。

更新は Delta Live テーブル パイプラインによって管理されるため、具体化されたビューの作成に使用される Databricks SQLウェアハウスは使用されず、更新操作中に実行する必要はありません。

一部のクエリーは増分更新できます。 「マテリアライズドビューの増分更新」を参照してください。増分更新を実行できない場合は、代わりに完全更新が実行されます。

マテリアライズドビューの更新をスケジュールする

Databricks SQL 具体化ビューは、定義されたスケジュールに基づいて自動的に更新するように構成できます。 マテリアライズドビューを作成する とき、または ALTER VIEW ステートメントを使用してスケジュールを追加するときに、 SCHEDULE 句を使用してこのスケジュールを構成します。スケジュールが作成されると、更新を処理するように新しい Databricks ジョブが自動的に構成されます。 スケジュールは、 DESCRIBE EXTENDED ステートメントでいつでも表示できます。

マテリアライズドビュー の定義を更新する

マテリアライズドビューの定義を更新するには、まずマテリアライズドビューをドロップしてから再作成する必要があります。

マテリアライズドビュー のドロップ

マテリアライズドビューをドロップするコマンドを送信するには、そのマテリアライズドビューの所有者である必要があります。

マテリアライズド ビューを削除するには、 DROP VIEWステートメントを使用します。 DROPステートメントを送信するには、Databricks UI のSQL エディターDatabricks SQL CLI 、またはDatabricks SQL APIを使用できます。 次の例では、 mv1 実体化ビュー (Materialized View) を削除します。

DROP MATERIALIZED VIEW mv1;

マテリアライズドビュー の説明

マテリアライズドビューの列とデータ型を取得するには、 DESCRIBE ステートメントを使用します。 列、データ型、およびマテリアライズド ビューの所有者、場所、作成時間、更新ステータスなどのメタデータを取得するには、 DESCRIBE EXTENDEDを使用します。 DESCRIBEステートメントを送信するには、Databricks UI のSQL エディターDatabricks SQL CLI 、またはDatabricks SQL APIを使用します。

マテリアライズドビューの更新 のステータスを表示する

Delta Live Tables パイプラインは具体化されたビューの更新を管理するため、パイプラインの起動時間によって待機時間が発生します。 この時間は、更新の実行に必要な時間に加えて、秒から分単位になる場合があります。

具体化されたビューの更新の状態を表示するには、Delta Live Tables UI で具体化されたビューを管理するパイプラインを表示するか、具体化されたビューの DESCRIBE EXTENDED コマンドによって返される 更新情報 を表示します。

また、Delta Live Tables イベント ログに対してクエリを実行して、具体化されたビューの更新履歴を表示することもできます。 「マテリアライズドビューの更新履歴を表示する」を参照してください。

Delta Live Tables UI で更新状態を表示する

デフォルトにより、具体化されたビューを管理する Delta Live Tables パイプラインは Delta Live Tables UIに表示されません。 Delta Live Tables UI でパイプラインを表示するには、パイプラインの [パイプラインの詳細] ページへのリンクに直接アクセスする必要があります。リンクにアクセスするには:

  • SQL エディターREFRESH コマンドを送信する場合は、[結果] パネルのリンクに従います。

  • DESCRIBE EXTENDED ステートメントによって返されるリンクをたどります。

  • 具体化されたビューの系列 タブで 、[ パイプライン] をクリックし、パイプライン リンクをクリックします。

アクティブな更新 を停止する

Delta Live Tables UI でアクティブな更新を停止するには、[パイプライン の詳細] ページで [ 停止 ] をクリックしてパイプラインの更新を停止します。 Databricks CLI または POST /api/2.0/パイプライン/{{パイプライン}/stop を使用して更新を停止することもできます パイプライン API での操作。

具体化されたビュー へのアクセスを制御する

具体化されたビューは、豊富なアクセス制御をサポートして、潜在的にプライベートなデータを公開しないようにしながら、データ共有をサポートします。 マテリアライズドビューの所有者は、他のユーザーに SELECT 権限を付与できます。 マテリアライズドビューへの SELECT アクセス権を持つユーザーは、マテリアライズドビューによって参照されるテーブルへの SELECT アクセス権を必要としません。 このアクセス制御により、基になるデータへのアクセスを制御しながら、データを共有できます。

マテリアライズドビュー への権限の付与

マテリアライズドビューへのアクセスを許可するには、 GRANT ステートメントを使用します。

GRANT
  privilege_type [, privilege_type ] ...
  ON <mv_name> TO principal;

privilege_typeは次のとおりです。

  • SELECT - ユーザーはマテリアライズドビュー SELECT できます。

  • REFRESH - ユーザーはマテリアライズドビュー REFRESH できます。 更新は、所有者のアクセス許可を使用して実行されます。

次の例では、マテリアライズドビューを作成し、選択権限と更新権限をユーザーに付与します。

CREATE MATERIALIZED VIEW <mv_name> AS SELECT * FROM <base_table>;
GRANT SELECT ON <mv_name> TO user;
GRANT REFRESH ON <mv_name> TO user;

マテリアライズドビュー からの権限の取り消し

マテリアライズドビューからアクセスを取り消すには、 REVOKE ステートメントを使用します。

REVOKE
  privilege_type [, privilege_type ]
  ON <name> FROM principal;

ベーステーブルに対する SELECT 権限が、マテリアライズドビューの所有者またはマテリアライズドビューへの SELECT 権限を付与された他のユーザーから取り消された場合、またはベーステーブルが削除された場合、マテリアライズドビューの所有者またはアクセス権を付与されたユーザーは、引き続きマテリアライズドビューをクエリーできます。 ただし、次の現象が発生します。

  • マテリアライズドビューの所有者またはマテリアライズドビューへのアクセスを失った他のユーザーは、そのマテリアライズドビュー REFRESH できなくなり、マテリアライズドビューは古くなります。

  • スケジュールを使用して自動化されている場合、次にスケジュールされた REFRESH が失敗するか、実行されません。

次の例では、 mv1から SELECT 権限を取り消します。

REVOKE SELECT ON mv1 FROM user1;

具体化されたビュー の増分更新

マテリアライズドビューは、最後のリフレッシュ時にベーステーブルで使用可能なデータの最新のスナップショットバージョンに基づいて、定義クエリーの意味的に正しい結果を常に返します。 可能な場合、結果は増分的に更新されますが、結果は完全な再計算によって配信される結果と同じです。

任意のクエリーはマテリアライズドビューで定義できますが、増分的にリフレッシュされるクエリーのサブセットのみが定義されます。 具体化されたビューを増分更新できない場合、更新プロセスでは代わりに完全更新が使用されます。 使用するモードを判別するには、増分更新 と完全更新のどちらを使用するかの判別を参照してください。

増分更新される具体化されたビューの種類は何ですか?

特定の種類のベース テーブルをクエリするマテリアライズドビューでは、増分更新の範囲が広くなります。 「(詳細) 増分更新が可能なマテリアライズドビューの定義」を参照してください。

次に、増分更新をサポートする式、キーワード、および句について説明します。

  • マテリアライズドビューでは、単一のテーブルのみにクエリを実行したり、複数のテーブルに対して INNER JOINUNION ALL (または INNER JOINUNION ALLの組み合わせ) を実行したりできます。

  • 具体化されたビューには、メインの select 句に GROUP BY が必要です。

  • 実体化ビュー (Materialized View) SELECT 句に含めることができるのは、次の集計関数のみです。

    • 数える

  • クエリでマテリアライズドビューを作成するために使用される関数は、決定論的である必要があります。 たとえば、 CURRENT_TIMESTAMP の使用は許可されていません。

次に、実体化ビュー (Materialized View) の増分更新に関する制限事項について説明します。

  • 増分更新は、以下を含む具体化されたビューではサポートされていません。

    • ウィンドウ関数。

    • HAVING 句。

    • SELECT 句または WHERE 句のサブクエリ。

    • LEFT JOINs または OUTER JOINs。

  • 増分更新は、Delta Lake タイムトラベル 機能を使用して作成された具体化されたビューではサポートされていません。

さらに、特定の高度な使用例を除き、マテリアライズド ビューのベース テーブルでは変更データフィードが必要です。 ベース テーブルで変更データフィードを有効にするには、次の構文を使用してdelta.enableChangeDataFeedテーブル プロパティを設定します。

ALTER TABLE table1 SET TBLPROPERTIES (delta.enableChangeDataFeed = true);

(上級)増分更新 が可能なマテリアライズドビューの定義

以下では、具体化されたビューを増分的に更新できる高度なユースケースについて説明します。 変更データ フィードは、次の高度なユース ケースでの増分更新には必要ありません。

ここで説明するユースケースには、次の制限が適用されます。

  • クエリでマテリアライズドビューを作成するために使用される関数は、決定論的である必要があります。 たとえば、 CURRENT_TIMESTAMP の使用は許可されていません。

  • マテリアライズドビューは、Delta Lake タイムトラベル 機能を使用して作成することはできません。

  • LEFT JOINs および OUTER JOINはサポートされていません。

クエリー パーティションを持つテーブル

具体化されたビューでは、パーティションを利用して完全な更新を回避できます。 マテリアライズドビューがベーステーブルと同じパーティションキーを共有している場合、マテリアライズドビューは変更されたパーティションを検出し、結果をマテリアライズするために必要なマテリアライズドビュー内のパーティションのみを変更できます。 大きなテーブルの場合、これにより時間とリソースを大幅に節約できます。

パーティションを持つテーブルで具体化されたビューを定義するときに増分更新をサポートする式、キーワード、および句を次に示します。 次のシナリオでは、具体化されたビューがベース テーブルと少なくとも 1 つのパーティション キーを共有している場合、具体化されたビューはベース テーブルと "共同パーティション化" されます。

  • パーティション化されたマテリアライズドビューは、単一のテーブルをクエリーできます。

    • マテリアライズドビューは、ベーステーブルと共同パーティション化する必要があります。

  • パーティション化されたマテリアライズドビューは、複数のテーブルに対して UNION ALL を実行できます。

    • マテリアライズドビューは、すべてのベーステーブルと共同パーティション化する必要があります。

  • パーティション化された具体化されたビューでは、ディメンション テーブルを持つファクト テーブルの INNER JOIN を使用できます。

    • 具体化されたビューは、ファクト テーブルと共同パーティション分割する必要があります。

    • ディメンション テーブルをパーティション分割する必要はありません。 ディメンション テーブルで更新が検出されると、具体化されたビューは完全に更新されます。

追加専用の テーブルに対するクエリー

ブロンズ レイヤー のテーブルの一般的なパターンは、新しい行がテーブルに挿入されるだけです。マテリアライズドビューは、追加専用のベーステーブルを自動的に検出し、マテリアライズドビューに新しい行のみを挿入することで増分更新します。 大きなテーブルの場合、これにより時間とリソースを大幅に節約できる可能性があります。

追加専用テーブルの上にマテリアライズドビューを定義するときに増分更新をサポートするには、以下が必要です。

  • マテリアライズドビューは、単一のテーブルのみ、または複数のテーブルの INNER JOINUNION ALL (または INNER JOIN and UNION ALLの組み合わせ)のみをクエリーできます。

  • ベース テーブルは追加専用である必要があります。

  • 外部システムによってマテリアライズドビューのベーステーブルに行が更新または削除されると、マテリアライズドビューは完全に更新されます。

マテリアライズドビューの更新履歴を表示する

現在および過去の更新を含む、具体化されたビューに対する REFRESH 操作の状態を表示するには、Delta Live Tables イベント ログをクエリーします。

SELECT
  *
FROM
  event_log(TABLE(<fully-qualified-table-name>))
WHERE
  event_type = "update_progress"
ORDER BY
  timestamp desc;

<fully-qualified-table-name> を、カタログとスキーマを含む実体化ビュー (Materialized View) の完全修飾名に置き換えます。

Delta Live Tables イベント ログとは」を参照してください。

増分更新と完全更新のどちらを使用するか の判断

具体化されたビューの更新のパフォーマンスを最適化するために、Databricks はコスト モデルを使用して、更新に使用する手法を選択します。 次の表では、これらの手法について説明します。

技術

増分更新?

説明

FULL_RECOMPUTE

いいえ

マテリアライズドビューが完全に再計算されました

NO_OP

該当なし

基本表への変更が検出されなかったため、マテリアライズド・ビューは更新されませんでした。

ROW_BASED 又は PARTITION_OVERWRITE

はい

具体化されたビューは、指定された手法を使用して増分更新されました。

使用されている手法を特定するには、 event_typeplanning_informationされている Delta Live Tables イベント ログをクエリーします。

SELECT
  timestamp,
  message
FROM
  event_log(TABLE(<fully-qualified-table-name>))
WHERE
  event_type = 'planning_information'
ORDER BY
  timestamp desc;

<fully-qualified-table-name> を、カタログとスキーマを含む実体化ビュー (Materialized View) の完全修飾名に置き換えます。

Delta Live Tables イベント ログとは」を参照してください。

制限

  • MV の管理方法と場所には制限があります。

    • Databricks SQL マテリアライズド ビューは、プロ SQLウェアハウスおよびサーバレス SQLウェアハウスでのみ作成および更新できます。

    • Databricks SQL マテリアライズド ビューは、それを作成したワークスペースからのみ更新できます。

    • Databricks SQL 具体化されたビューは、Databricks SQLウェアハウス、Delta Live Tables、および Databricks Runtime 11.3 以降を実行している共有クラスターからのみクエリできます。 クエリーは、シングルユーザーアクセスモードクラスターから具体化されたビューから行うことはできません。

  • 具体化されたビューのベース テーブルは、マネージド テーブルまたは外部テーブルとして Unity Catalog に登録する必要があります。

  • Databricks SQL マテリアライズドビューの所有者は変更できません。

  • 具体化されたビューは、ID 列または代理キーをサポートしていません。

  • マテリアライズドビューに対してアドホック OPTIMIZE または VACUUM コマンドを実行することはできません。

  • マテリアライズドビューが NULL可能列に対して合計集計を使用し、その列に NULL 値のみが残っている場合、マテリアライズドビューの結果集計値は NULLではなく 0 になります。

  • 列参照には別名は必要ありませんが、列参照以外の式には別名が必要です。 たとえば、次のステートメントは使用できません: SELECT col1, SUM(col2) FROM t GROUP BY col1. 代わりに、次のステートメントを使用します: SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1.

  • Databricks SQL 具体化されたビューでは、 行フィルターまたは列マスク を使用できません。

  • 具体化されたビューをサポートする基になるファイルには、具体化されたビューの定義に表示されないアップストリームテーブルのデータ (個人を特定できる可能性のある情報を含む) が含まれる場合があります。 このデータは、具体化されたビューの増分更新をサポートするために、基になるストレージに自動的に追加されます。 具体化されたビューの基になるファイルは、具体化されたビュー スキーマの一部ではないアップストリーム テーブルからのデータを公開するリスクがあるため、Databricks では、基になるストレージを信頼されていないダウンストリーム コンシューマーと共有しないことをお勧めします。 たとえば、マテリアライズドビューの定義に COUNT(DISTINCT field_a) 句が含まれているとします。 マテリアライズドビュー定義には aggregate COUNT DISTINCT 句のみが含まれていますが、基になるファイルには field_aの実際の値のリストが含まれます。