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

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

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

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

Databricks SQLでは、マテリアライズドビューはUnity Catalogクエリの結果を物理的に格納するマネージドテーブルです。コンピュートがオンデマンドで結果を返す標準ビューとは異なり、マテリアライズドビューは結果をキャッシュし、基になるソース テーブルがスケジュールに従って、または自動的に変更されるたびに結果を更新します。

マテリアライズドビューは、抽出、変換、ロード (ETL) 処理などのデータ処理ワークロードに適しています。 マテリアライズドビュー は、コンプライアンス、修正、集計、または一般的なチェンジデータキャプチャ (CDC) のデータを処理するためのシンプルで宣言的な方法を提供します。 また、マテリアライズドビューは、ベーステーブルのクリーニング、強化、非正規化を行うことで、使いやすい変換を可能にします。 高価なクエリや頻繁に使用されるクエリを事前に計算することで、マテリアライズドビューはクエリのレイテンシーとリソース消費を削減します。 多くの場合、ソース テーブルから 変更を段階的にコンピュート できるため、効率とエンド ユーザー エクスペリエンスがさらに向上します。

次に、マテリアライズドビューの一般的な使用例を示します。

  • BI ダッシュボードを最新の状態に保ち、エンドユーザーのクエリの遅延を最小限に抑えます。
  • ETLシンプルな ロジックで複雑な オーケストレーションを削減します。SQL
  • 複雑で階層化された変換の構築。
  • 常に安定したパフォーマンスが求められるユースケースや、最新の知見

Databricks SQL ウェアハウスでマテリアライズドビューを作成すると、マテリアライズドビューの作成と更新を処理するためのサーバレス パイプラインが作成されます。カタログ エクスプローラで更新操作のステータスを監視できます。DESCRIBE EXTENDEDによるマテリアライズドビューの詳細の表示を参照してください。

必要条件

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

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

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

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

  • Deltaテーブルからマテリアライズドビューを増分更新するには、ソース テーブルで行追跡が有効になっている必要があります。

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

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

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

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

マテリアライズドビューをクエリするための要件:

  • マテリアライズドビューの所有者であるか、マテリアライズドビューに SELECT があり、その親に USE SCHEMAUSE CATALOG を持っている必要があります。

  • 次のいずれかのコンピュート リソースを使用する必要があります。

    • SQLウェアハウス

    • DLT インターフェース

    • 標準アクセスモード コンピュート (旧共有アクセスモード)

    • Databricks Runtime 15.4 以降の専用アクセスモード (旧シングルユーザーアクセスモード) (ワークスペースがサーバレス コンピュートに対して有効になっている場合)。専用コンピュート (旧称 シングルユーザーコンピュート) のきめ細かなアクセス制御を参照してください。

      マテリアライズドビュー の所有者である場合は、14.3 以上 Databricks Runtime で実行されている専用アクセス モード コンピュート リソースを使用できます。

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

マテリアライズドビューの作成

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

マテリアライズドビューを作成するには、 CREATE MATERIALIZED VIEW ステートメントを使用します。 create ステートメントを送信するには、Databricks UI、 Databricks SQL CLI、または Databricks SQL API の SQL エディターを使用します。

マテリアライズドビューを作成するユーザは、マテリアライズドビューの所有者です。

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

SQL
-- This query defines the materialized view:
CREATE OR REPLACE MATERIALIZED VIEW mv1
AS SELECT
date,
sum(sales) AS sum_of_sales
FROM
base_table1
GROUP BY
date;

CREATE OR REPLACE MATERIALIZED VIEW ステートメントを使用してマテリアライズドビューを作成すると、最初のデータ更新と入力がすぐに開始されます。これは SQLウェアハウス コンピュートを消費しません。 代わりに、サーバレス DLT が作成とその後の更新に使用されます。

ベース テーブルの列コメントは、作成時のみ新しいマテリアライズドビューに自動的に反映されます。 スケジュール、テーブル制約、またはその他のプロパティを追加するには、マテリアライズドビュー 定義 ( SQL クエリ) を変更します。

同じ SQL ステートメントは、マテリアライズドビューがその後に呼び出された場合、またはスケジュールに従って呼び出された場合に更新されます。 この方法で行われた更新は、他の更新と同様に機能します。詳細については、「 マテリアライズドビューの更新」を参照してください。

マテリアライズドビューの設定の詳細については、Databricks SQLでのマテリアライズドビューの設定を参照してください。マテリアライズドビューを作成するための完全な構文については、 CREATE MATERIALIZED VIEWを参照してください。さまざまな形式で、さまざまな場所からデータを読み込む方法については、「 DLT を使用したデータの読み込み」を参照してください。

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

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

機密データを隠す

備考

プレビュー

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

マテリアライズドビューを使用すると、テーブルにアクセスするユーザーから機密データを隠すことができます。これを行う 1 つの方法は、クエリを作成して、最初にそのデータが含まれないようにすることです。ただし、クエリを実行するユーザーのアクセス許可に基づいて列をマスクしたり、行をフィルター処理したりすることもできます。たとえば、グループ HumanResourcesDeptに属さないユーザーの tax_id 列を非表示にできます。これを行うには、マテリアライズドビューの作成時に ROW FILTER 構文と MASK 構文を使用します。 詳細については、「 行フィルターと列マスクを使用した機密性の高いテーブル データのフィルター処理」を参照してください。

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

マテリアライズドビューを再表示すると、更新時にベース・テーブルに対する最新の変更を反映するようにビューが更新されます。

マテリアライズドビューを定義すると、 CREATE OR REPLACE 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;

デフォルトでは、操作は同期的であるため、更新操作が完了するまでコマンドはブロックされます。非同期に更新するには、ASYNC キーワードを追加します。

SQL
REFRESH MATERIALIZED VIEW mv1 ASYNC;

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

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

マテリアライズドビューは、2つの方法のいずれかを使用してリフレッシュされます。

  • 増分更新 - システムはビューのクエリを評価して、最後の更新後に発生した変更を特定し、新しいデータまたは変更されたデータのみをマージします。
  • 完全更新 - 増分更新を実行できない場合、システムはクエリ全体を実行し、マテリアライズドビューの既存のデータを新しい結果に置き換えます。

クエリの構造とソース データのタイプによって、増分更新がサポートされているかどうかが決まります。増分更新をサポートするには、ソース データを Delta テーブルに格納し、行追跡とチェンジデータ フィードを有効にする必要があります。 マテリアライズドビューを作成した後、その更新動作を監視して、増分的に更新されるか、完全再表示によって更新されるかを確認できます。

更新タイプの詳細と、増分更新の最適化方法については、 マテリアライズドビューの増分更新を参照してください。

非同期更新

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

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

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

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

注記

または、 CREATE OR REPLACE MATERIALIZED VIEW ステートメントまたは REFRESH ステートメントを含むジョブでタスクを作成し、他のジョブと同様に調整することもできます。「Databricks ジョブを使用したオーケストレーション」を参照してください。

次の例では、ベース テーブル base_table1からマテリアライズドビュー mv1を作成し、マテリアライズドビューを 1 時間に 1 回更新するスケジュールを作成します。

SQL
CREATE OR REPLACE MATERIALIZED VIEW mv1
SCHEDULE EVERY 1 hour
AS SELECT
date,
sum(sales) AS sum_of_sales
FROM
base_table1
GROUP BY
date;

作成後にスケジュールを設定または変更するには、 ALTER MATERIALIZED VIEW ステートメントを使用します。

SQL
ALTER MATERIALIZED VIEW sales ALTER SCHEDULE EVERY 1 day;

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

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

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

更新のスケジュールがある場合でも、更新されたデータが必要な場合は、いつでも手動更新を実行するオプションがあります。

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

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

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

備考

プレビュー

マテリアライズドビューでの REORG ステートメントのサポートは 、パブリック プレビュー段階です。

注記
  • REORG ステートメントをマテリアライズドビューで使用するにはDatabricks Runtime15.4 以降が必要です。
  • REORG ステートメントは任意のマテリアライズドビューで使用できますが、削除ベクトルが有効になっているマテリアライズドビューからレコードを削除する場合にのみ必要です。このコマンドは、削除ベクトルを有効にせずにマテリアライズドビューと共に使用すると、効果がありません。

GDPR コンプライアンスなど、削除ベクトルが有効になっているマテリアライズドビューの基になるストレージからレコードを物理的に削除するには、マテリアライズドビューのデータに対して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メンテナンスタスクが自動的に実行されます。

Drop a マテリアライズドビュー

注記

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

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

SQL
DROP MATERIALIZED VIEW mv1;

カタログエクスプローラを使用して、マテリアライズドビューを削除することもできます。

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

マテリアライズドビューのコストを理解する

マテリアライズドビュー は、ノートブックまたはジョブ用に設定したコンピュートの外部にあるサーバレス コンピュートで実行されるため、マテリアライズドに関連するコストをどのように理解すればよいのか疑問に思うかもしれません。 マテリアライズドビュー の使用状況は、 DBU 消費量によって追跡されます。 詳細については、「 マテリアライズドビュー またはストリーミングテーブルの DBU 消費量は?

行追跡の有効化

Delta テーブルからの増分更新をサポートするには、それらのソース テーブルで行追跡を有効にする必要があります。ソース・テーブルを再作成する場合は、行追跡を再度有効にする必要があります。

次の例は、テーブルで行追跡を有効にする方法を示しています。

SQL
ALTER TABLE source_table SET TBLPROPERTIES (delta.enableRowTracking = true);

詳細については、「Delta テーブルの行追跡を使用する」を参照してください

制限

  • コンピュートとワークスペースの要件については、「 要件」を参照してください。

  • 増分更新の要件については、 マテリアライズドビューの増分更新を参照してください。

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

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

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

  • タイムトラベル クエリは、マテリアライズドビューではサポートされていません。

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

  • これらの機能を専用のコンピュートで使用している場合でも、一部のサーバレス コンピュート料金が発生する場合があります。

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

関連記事