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 Catalog対応の 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 パイプライン の更新 が開始され、更新が処理されます。

更新は 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 での操作。

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

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

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

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

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

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

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

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

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

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

具体化されたビューは、豊富なアクセス制御をサポートして、潜在的にプライベートなデータを公開しないようにしながら、データ共有をサポートします。 マテリアライズドビューの所有者は、他のユーザーに 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;

変更データフィードを有効にする

特定の高度な使用例を除き、マテリアライズド ビューのベース テーブルにはチェンジデータ フィードが必要です。 基本テーブルでチェンジデータフィードを有効にするには、次の構文を使用して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ウェアハウス、Delta Live Tables、および Databricks Runtime 11.3 以降を実行している共有クラスターからのみクエリできます。 クエリーは、シングルユーザーアクセスモードクラスターから具体化されたビューから行うことはできません。

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

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

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