メインコンテンツまでスキップ

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

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

注記

マテリアライズドビューで AWS PrivateLink 接続を使用する必要がある場合は、Databricks の担当者にお問い合わせください。

important

Databricks SQLで作成されたマテリアライズドビュー は、サーバレス DLT パイプラインによって支えられています。この機能を使用するには、ワークスペースがサーバレス パイプラインをサポートしている必要があります。

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

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

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

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

必要条件

マテリアライズドビューを作成または更新するには:

  • Unity Catalog 対応の Pro または サーバレス SQLウェアハウスを使用する必要があります。

  • マテリアライズドビューを更新するには、それを作成したワークスペースにいる必要があります。

  • ワークスペースは、 サーバレス SQLウェアハウスをサポートするリージョンにある必要があります。

  • サーバレス の利用規約に同意しておく必要があります。

マテリアライズドビューをクエリするには:

  • マテリアライズドビューの所有者であるか、マテリアライズドビューに SELECT があり、その親に USE SCHEMAUSE CATALOG を持っている必要があります。
  • 次のいずれかのコンピュート リソースを使用する必要があります。
    • SQLウェアハウス
    • DLT インターフェース
    • 標準アクセスモード コンピュート (旧共有アクセスモード)
    • Databricks Runtime 15.4 以降の専用アクセスモード (旧シングルユーザーアクセスモード) (ワークスペースがサーバレス コンピュートに対して有効になっている場合)。「専用コンピュート (旧称 single user コンピュート) のきめ細かなアクセス制御」を参照してください。
    • マテリアライズド ビューの所有者である場合のみ: 14.3 から 15.3 までの Databricks Runtime で実行されている専用アクセス モード コンピュート リソース。

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

マテリアライズドビューを作成してください

Databricks SQL マテリアライズドビュー CREATE操作では、 Databricks SQL ウェアハウスを使用して、マテリアライズドビューでデータを作成およびロードします。 マテリアライズドビューの作成は同期操作であるため、マテリアライズドビューが作成され、初期データの読み込みが完了するまで、 CREATE MATERIALIZED VIEW コマンドはブロックされます。 サーバレス DLT パイプラインは、 Databricks SQL マテリアライズドビューごとに自動的に作成されます。 マテリアライズド ビューが更新されると 、DLT パイプラインは更新を処理します。

実体化ビュー (Materialized View) を作成するには、 CREATE MATERIALIZED VIEW 文を使用します。 create ステートメントを送信するには、Databricks UI、 Databricks SQL CLI、または Databricks SQL API の SQL エディターを使用します。

注記

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

  • SELECT マテリアライズド・ビューによって参照されるベース・テーブルに対する権限。
  • USE CATALOG マテリアライズドビューのソーステーブルを含むカタログとスキーマに対する USE SCHEMA 権限。
  • USE CATALOG マテリアライズドビューのターゲットカタログとスキーマに対する USE SCHEMA 権限。
  • CREATE TABLE マテリアライズドビューを含むスキーマに対する CREATE MATERIALIZED VIEW 権限。

次の例では、実体化ビュー mv1 をベース テーブル base_table1から作成します。

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

ベース・テーブルのカラム・コメントは、新しいマテリアライズド・ビューに自動的に反映されます。 スケジュール、テーブル制約、またはその他のプロパティを追加するには、マテリアライズドビューの定義を変更します。 マテリアライズドビューを定義するための構文の詳細については、 CREATE MATERIALIZED VIEWを参照してください。

ランタイム チャンネルを設定する

SQLウェアハウスを使用して作成されたマテリアライズドビュー は、DLT パイプラインを使用して自動的に更新されます。DLT パイプラインは、デフォルトによって current チャンネルのランタイムを使用します。 リリースプロセスについては 、DLT リリースノートとリリースアップグレードプロセス を参照してください。

Databricks 本番運用ワークロードには、current チャンネルを使用することをお勧めします。 新機能は最初に preview チャンネルにリリースされます。 プレビュー DLT チャンネルにパイプラインを設定して、 preview をテーブル プロパティとして指定することで、新機能をテストできます。 このプロパティは、テーブルを作成するとき、または ALTER ステートメントを使用してテーブルを作成した後に指定できます。

次のコード例は、CREATE ステートメントでチャンネルをプレビューに設定する方法を示しています。

SQL
CREATE OR REPLACE MATERIALIZED VIEW foo.default.bar
TBLPROPERTIES ('pipelines.channel' = 'preview') as
SELECT
*
FROM
range(5)

外部システムからのデータのロード

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

マテリアライズドビューの更新

REFRESH操作では、実体化ビュー (Materialized View) が更新され、ベース・テーブルに対する最新の変更が反映されます。デフォルトでは、操作は同期的であるため、更新操作が完了するまでコマンドはブロックされます。 マテリアライズド・ビューを更新するには、 REFRESH MATERIALIZED VIEW 文を使用します。 このコマンドの 構文とパラメーターの詳細については 、 REFRESH(MATERIALIZED VIEW STREAMING TABLEまたは) を参照してください。SQL増分更新できる具体化されたビューの種類の詳細については、「 具体化されたビューの増分更新」を参照してください。

更新ステートメントを送信するには、SQL DatabricksUI の エディター、 ウェアハウスにアタッチされたノートブック、SQL Databricks SQLCLI、またはDatabricks SQLAPI を使用します。

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

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

SQL
REFRESH MATERIALIZED VIEW mv1;

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

マテリアライズドビュー は、サーバレス DLT パイプラインを自動的に作成して使用し、更新操作を処理します。 更新は DLT パイプラインによって管理され、更新はマテリアライズドビューの作成に使用された Databricks SQL ウェアハウスによって監視されます。 マテリアライズドビュー は、スケジュールに従って実行される DLT パイプラインを使用して更新できます。 「トリガー パイプライン モードと継続的パイプライン モード」を参照してください。

注記

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

デフォルトでは、更新操作は同期的に実行されます。 また、更新操作を非同期的に実行するように設定することもできます。 これは、更新コマンドを使用して設定できます。 REFRESH (MATERIALIZED VIEW または STREAMING TABLE)を参照してください。各アプローチに関連する動作は次のとおりです。

  • 同期: 同期更新は、更新が完了するまで他の操作を続行できません。 Databricks ジョブなどのオーケストレーション ツールで更新操作をシーケンス処理する場合など、次の手順で結果が必要な場合は、同期更新を使用します。 ジョブで具体化されたビューを調整するには、 SQL タスクタイプを使用します。 「Databricks のオーケストレーションの概要」を参照してください。
  • 非同期 : 非同期更新は、マテリアライズドビュー 更新が開始されると DLT コンピュートでバックグラウンド ジョブを開始し、データの読み込みが完了する前にコマンドが戻ることができます。 この更新タイプでは、コマンドが開始されるウェアハウスのコンピュート容量が必ずしも操作に保持されるとは限らないため、コストを節約できます。 更新がアイドル状態になり、他のタスクが実行されていない場合、ウェアハウスはシャットダウンでき、更新は他の使用可能なコンピュートを使用します。 さらに、非同期更新では、複数の操作を並行して開始できます。

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

具体化されたビューの更新のスケジュール

Databricks SQL マテリアライズド ビューは、定義されたスケジュールに基づいて自動的に更新されるように構成できます。 スケジュールを設定するには、次のいずれかの操作を行います。

スケジュールが作成されると、更新を処理するように新しい Databricks ジョブが自動的に構成されます。

スケジュールを表示するには、次のいずれかの操作を行います。

  • Databricks UI の SQL エディターから DESCRIBE EXTENDED ステートメントを実行します。
  • カタログエクスプローラを使用して、マテリアライズドビューを表示します。 スケジュールは、[ 概要 ] タブの [更新ステータス ] の下に表示されます。 「カタログエクスプローラとは」を参照してください。

具体化されたビューの更新の状態を表示する

注記

DLT パイプラインはマテリアライズドビュー 更新を管理するため、パイプラインの起動時間によって遅延が発生します。 この時間は、更新の実行に必要な時間に加えて、秒から数分になる場合があります。

マテリアライズドビュー 更新のステータスを表示するには、DLT UI でマテリアライズドビューを管理するパイプラインを表示するか、マテリアライズドビューの DESCRIBE EXTENDED コマンドから返される 更新情報 を表示します。

DLT イベント ログを照会して、マテリアライズドビューの更新履歴を表示することもできます。 マテリアライズドビューの更新履歴の表示を参照してください。

クエリ履歴を使用した実行の監視

クエリ履歴ページを使用して、クエリの詳細とクエリプロファイルにアクセスできるため、ストリーミングテーブルの更新を実行するために使用される DLT パイプラインのパフォーマンスの低いクエリやボトルネックを特定できます。クエリ履歴とクエリ プロファイルで使用できる情報の種類の概要については、「 クエリ履歴 」および 「クエリ プロファイル」を参照してください。

備考

プレビュー

この機能は パブリック プレビュー段階です。 ワークスペース管理者は、 プレビュー ページからこの機能を有効にできます。 「Databricks プレビューの管理」を参照してください。

マテリアライズドビューに関連するすべてのステートメントがクエリ履歴に表示されます。 [ステートメント] ドロップダウン フィルターを使用して、任意のコマンドを選択し、関連するクエリを検査できます。すべての CREATE ステートメントの後には、DLT パイプラインで非同期に実行される REFRESH ステートメントが続きます。通常、 REFRESH ステートメントには、パフォーマンスの最適化に関する知見を提供する詳細なクエリ プランが含まれています。

クエリ履歴 UI で REFRESH ステートメントにアクセスするには、次の手順を使用します。

  1. 左側のサイドバーで [ 履歴アイコン ] をクリックして、 クエリー履歴 UI を開きます。
  2. 「ステートメント 」ドロップダウン・フィルターから「 REFRESH 」チェック・ボックスを選択します。
  3. クエリステートメントの名前をクリックすると、クエリの実行時間や集計されたメトリクスなどの概要の詳細が表示されます。
  4. [ クエリ プロファイルの表示 ] をクリックして、クエリ プロファイルを開きます。 クエリ プロファイルのナビゲーションの詳細については、「 クエリ プロファイル」を参照してください。
  5. 必要に応じて、[ クエリ ソース ] セクションのリンクを使用して、関連するクエリまたはパイプラインを開きます。

CREATE MATERIALIZED VIEWを参照してください。

DLT UI で更新ステータスを表示する

By Default では、マテリアライズドビューを管理する DLT パイプラインは DLT UI に表示されません。 DLT UI でパイプラインを表示するには、パイプラインの パイプライン詳細 ページへのリンクに直接アクセスする必要があります。 リンクにアクセスするには:

  • DESCRIBE EXTENDED ステートメントによって返されるテーブルの Latest 更新 行に示されているリンクをコピーして貼り付けます。
  • 具体化ビュー (Materialized View) の リネージ タブで 、[ パイプライン ] をクリックし、次に [パイプライン] リンクをクリックします。

Databricks UI の SQL エディターを使用して送信された非同期 REFRESH コマンドの場合は、[ 結果 ] パネルに表示されるリンクに従って更新状態を表示できます。

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

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

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

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

削除ベクトルが有効になっているマテリアライズドビューからのレコードの完全削除

備考

プレビュー

具体化されたビューでの REORG ステートメントのサポートは 、パブリック プレビュー段階です。

注記
  • 具体化されたビューで REORG ステートメントを使用するには、Databricks Runtime 15.4 以降が必要です。
  • REORG ステートメントは任意の具体化されたビューで使用できますが、削除ベクトルが有効になっている実体化されたビューからレコードを削除する場合にのみ必要です。このコマンドは、削除ベクトルが有効になっていない実体化ビュー (Materialized View) と共に使用すると、効果がありません。

削除ベクトルが有効になっている実体化ビュー (Materialized View) の基盤となるストレージからレコードを物理的に削除するには ( GDPR コンプライアンスなど)、実体化ビュー (Materialized View) のデータに対して vacuum 操作が実行されるようにするための追加の手順を実行する必要があります。

以下では、これらの手順について詳しく説明します。

  1. マテリアライズド・ビューに対して REORG 文を実行し、 APPLY (PURGE) パラメータを指定します。 たとえば、 REORG TABLE <materialized-view-name> APPLY (PURGE);. REORG TABLE を参照してください。
  2. マテリアライズドビューのデータ保持期間が経過するまで待ちます。 デフォルトのデータ保持期間は 7 日間ですが、 delta.deletedFileRetentionDuration テーブル プロパティを使用して構成できます。 タイムトラベル クエリのデータ保持の構成を参照してください。
  3. REFRESH the マテリアライズドビュー. 更新 a マテリアライズドビューを参照してください。REFRESH操作から24時間以内に、レコードを完全に削除するために必要なVACUUM操作を含むDLTメンテナンスタスクが自動的に実行されます。DLT によって実行されるメンテナンス タスクを参照してください。

具体化されたビューの削除

注記

マテリアライズド・ビューをドロップするコマンドをサブミットするには、そのマテリアライズド・ビューの所有者であるか、マテリアライズド・ビューに対する MANAGE 権限を持っている必要があります。

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

SQL
DROP MATERIALIZED VIEW mv1;

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

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

マテリアライズドビューの所有者を変更してください

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

  • 具体化ビュー (Materialized View) の リネージ タブで 、[ パイプライン ] をクリックし、次に [パイプライン] リンクをクリックします。
  • [共有 ] をクリックします。 [権限設定 ] ダイアログが表示されます。
  • 現在の所有者の名前の右側にある [x ] をクリックして、現在の所有者を削除します。
  • 入力を開始して、利用可能なユーザーのリストを絞り込んでください。 新しいパイプライン所有者にするユーザーをクリックします。
  • [保存 ] をクリックして変更を保存し、ダイアログを閉じます。

パイプラインで定義された具体化されたビューを含むすべてのパイプライン資産は、新しいパイプライン所有者によって所有されます。 今後のすべての更新は、新しい所有者の ID を使用して実行されます。

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

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

具体化されたビューへの権限の付与

マテリアライズドビューへのアクセス権を付与するには、 GRANT 文を使用します。

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

privilege_typeは次のとおりです。

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

次の例では、実体化ビュー (Materialized View) を作成し、ユーザーに選択権限と更新権限を付与します。

SQL
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 文を使用します。

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

実体化ビュー (Materialized View) の所有者、またはマテリアライズド・ビューに対する MANAGE 権限またはSELECT権限が付与されている他のユーザーからベース・テーブルに対するSELECT権限が取り消された場合、またはベース・テーブルが削除された場合、マテリアライズド・ビューの所有者またはアクセス権を付与されたユーザーは、引き続きマテリアライズド・ビューをクエリできます。ただし、次の動作が発生します。

  • マテリアライズドビューの所有者またはマテリアライズドビューへのアクセスを失った他のユーザーは、そのマテリアライズドビューを REFRESH できなくなり、マテリアライズドビューは古くなります。
  • スケジュールを使用して自動化されている場合、次のスケジュール REFRESH 失敗するか、実行されません。

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

SQL
REVOKE SELECT ON mv1 FROM user1;

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

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

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

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

マテリアライズドビューに対する REFRESH 操作のステータス (現在および過去の更新を含む) を表示するには、DLT イベントログをクエリします。

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

<fully-qualified-table-name> を、カタログやスキーマなど、マテリアライズドビューの完全修飾名に置き換えます。

DLT イベント ログとはを参照してください

カタログエクスプローラーでマテリアライズドビューに関する詳細情報を取得する

カタログエクスプローラを使用して、マテリアライズドビューの詳細を表示できます。

  1. サイドバーカタログアイコン カタログ をクリックします。
  2. 左側の [カタログ エクスプローラー] ツリーでカタログを開き、マテリアライズド ビューが配置されているスキーマを選択します。
  3. 選択したスキーマの下にある [テーブル ] 項目を開き、具体化されたビューをクリックします。

ここから、マテリアライズドビュー名の下にあるタブを使用して、マテリアライズドビューに関する次のような情報を表示および編集できます。

  • 更新ステータスと履歴
  • テーブルスキーマ
  • サンプルデータ(アクティブなコンピュートが必要)
  • 権限
  • リネージ (このマテリアライズド ビューが依存するテーブルとパイプラインを含む)
  • 使い方の知見
  • このマテリアライズドビュー用に作成したモニター

制限

  • コンピュートとワークスペースの要件については、「 要件」を参照してください。
  • マテリアライズドビューは、ID 列または代理キーをサポートしていません。
  • マテリアライズド・ビューが NULL-able列の合計を使用しており、その列に NULL の値しか残っていない場合、マテリアライズド・ビューの結果の集計値は NULL ではなくゼロになります。
  • マテリアライズドビューから チェンジデータフィード を読み取ることはできません。
  • タイムトラベルクエリは、実体化ビュー (Materialized View) ではサポートされていません。
  • マテリアライズドビューをサポートする基になるファイルには、マテリアライズドビューの定義に表示されないアップストリームテーブルのデータ (個人を特定できる可能性のある情報を含む) が含まれる場合があります。 このデータは、マテリアライズドビューの増分更新をサポートするために、基になるストレージに自動的に追加されます。 マテリアライズドビューの基になるファイルは、マテリアライズドビュー スキーマの一部ではないアップストリーム テーブルからのデータを公開するリスクがあるため、Databricks では、基になるストレージを信頼されていないダウンストリーム コンシューマーと共有しないことをお勧めします。 たとえば、マテリアライズドビューの定義に COUNT(DISTINCT field_a) 句が含まれているとします。 マテリアライズドビュー定義には aggregate COUNT DISTINCT 句のみが含まれていますが、基になるファイルには field_aの実際の値のリストが含まれます。