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

プレビュー

この機能はパブリックプレビュー段階です。

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

マテリアライズドビューとは

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

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

マテリアライズド ビューは、 Delta Live Tablesのリリースにより、Databricks Data Intelligence Platform で初めてサポートされました。 Databricks SQL ウェアハウスでマテリアライズド ビューを作成すると、マテリアライズド ビューへの更新を処理するための Delta Live Tables パイプラインが作成されます。 Delta Live Tables UI、Delta Live Tables API、または Delta Live Tables CLI で更新操作のステータスを監視できます。 「マテリアライズド ビューの更新ステータスの表示」を参照してください。

要件

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

  • サーバーの使用条件に同意している必要があります。

  • ワークスペースは、 SQL Serverをサポートするリージョンにある必要があります。

Databricks SQL でマテリアライズドビューを使用する場合の制限については、「 制限事項」を参照してください。

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

マテリアライズドビューを作成するには、 CREATE MATERIALIZED VIEW ステートメントを使用します。 Databricks SQL リファレンスの「 マテリアライズドビューの作成 」を参照してください。 作成ステートメントを送信するには、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 リファレンスの 「更新 (マテリアライズドビューとストリーミング テーブル)」 を参照してください。 更新ステートメントを送信するには、Databricks UI の SQL エディター 、Databricks SQL CLI、または Databricks SQL API を使用します。

マテリアライズドビューを REFRESH できるのは所有者だけです。

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

REFRESH MATERIALIZED VIEW mv1;

Databricks SQL マテリアライズドビューはどのように更新されますか?

マテリアライズド ビューは、Delta Live Tables パイプラインを自動的に作成して使用し、更新操作を処理します。 更新は Delta Live Tables パイプラインによって管理されるため、マテリアライズド ビューの作成に使用される Databricks SQL ウェアハウスは使用されず、更新操作中に実行する必要もありません。

Delta Live Tables パイプラインは、継続実行モードまたはトリガー実行モードのいずれかを使用します。 マテリアライズドビューは、どちらの実行モードでも更新できます。 連続実行モードで動作しているときに不要な処理を回避するために、パイプラインは依存する Delta テーブルを自動的に監視し、依存テーブルの内容が変更された場合にのみ更新を実行します。 「Delta Live Tables パイプラインとは何ですか?」を参照してください。

注:

Delta Live Tables Deltaデータソース以外の変更を検出できません。 テーブルは引き続き定期的に更新されますが、コンピュート上で発生する増分処理が過度に再計算されて遅くなるのを防ぐために、トリガー間隔が長くなっています。

デフォルトでは、更新操作は同期的に実行されます。 更新操作を非同期で実行するように設定することもできます。 各アプローチに関連する動作は次のとおりです。

  • 同期: 同期更新は、更新操作が完了するまで他の操作をブロックします。 これにより、ワークフローなどのオーケストレーション ツールで更新操作を順序付けることができます。 マテリアライズド ビューをワークフローでオーケストレーションするには、 SQLタスク タイプを使用します。 Databricks Workflowsの概要」を参照してください。

  • 非同期: 非同期更新は、マテリアライズド ビューの更新が開始されるとDelta Live Tables上でバックグラウンド ジョブを開始し、データのロードが完了する前にコマンドが戻ります。 Delta Live Tables パイプラインが更新を管理するため、マテリアライズド ビューの作成に使用される Databricks SQL ウェアハウスは使用されません。 更新操作中に実行する必要はありません。

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

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

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

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

実体化ビュー (Materialized View) の定義を更新するには、まず実体化ビュー (Materialized View) を削除してから再作成する必要があります。

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

注:

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

マテリアライズド ビューを削除するには、 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での操作。

マテリアライズドビューの所有者を変更する

メタストア管理者とワークスペース管理者の両方である場合は、マテリアライズド ビューの所有者を変更できます。 マテリアライズド ビューは、Delta Live Tables パイプラインを自動的に作成し、使用して変更を処理します。 マテリアライズド ビューの所有者を変更するには、次の手順に従います。

  • クリックジョブアイコンワークフロー、次にDelta Live Tablesタブをクリックします。

  • 所有者を変更するパイプラインの名前をクリックします。

  • クリックケバブメニューパイプライン名の右側にあるケバブ メニューをクリックし、 [権限]をクリックします。 これにより、権限ダイアログが開きます。

  • 現在の所有者の名前の右側にある [ x ] をクリックして、現在の所有者を削除します。

  • 入力を開始して、使用可能なユーザーのリストをフィルタリングします。 新しいパイプラインの所有者となるユーザーをクリックします。

  • 保存 」をクリックして変更を保存し、ダイアログを閉じます。

パイプラインで定義されたマテリアライズド ビューを含むすべてのパイプライン アセットは、新しいパイプライン所有者が所有します。 今後のすべての更新は、新しい所有者の ID を使用して実行されます。

マテリアライズドビューへのアクセスを制御する

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

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

実体化ビュー (Materialized View) へのアクセス権を付与するには、 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;

チェンジデータフィードを有効にする

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

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

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

現在および過去の更新を含む、マテリアライズドビューに対する 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 マテリアライズド ビューは、Databricks SQL ウェアハウス、Delta Live Tables、および Databricks Runtime 11.3 以降を実行している共有クラスターからのみクエリできます。

  • マテリアライズドビューは、ID 列または代理キーをサポートしていません。

  • 実体化ビュー (Materialized View) が NULL可能なカラムに対して合計集計を使用し、そのカラムに NULL 値しか残っていない場合、マテリアライズドビュー (Materialized View) の結果の集計値は NULLではなく 0 になります。

  • マテリアライズド ビューからチェンジデータ フィードを読み取ることはできません。

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