適用対象:
Databricks SQL
具体化されたビューは、事前計算済みの結果をクエリに使用できるビューであり、入力の変更を反映するように更新できます。 具体化されたビューが更新されるたびに、クエリ結果が再計算されてアップストリームのデータセットの変更が反映されます。 具体化されたすべてのビューは、ETL パイプラインによってサポートされます。 具体化されたビューは、手動で、またはスケジュールに従って更新できます。
手動更新を実行する方法の詳細については、「REFRESH (MATERIALIZED VIEW または STREAMING TABLE)を参照してください。
更新をスケジュールする方法の詳細については、「例の または ALTER MATERIALIZED VIEW」を参照してください。
具体化されたビューは、Pro または Serverless SQL ウェアハウスを使用するか、パイプライン内でのみ作成できます。
注
具体化されたビューとストリーミング テーブルに対する作成操作と更新操作は、サーバーレスの Lakeflow Spark 宣言パイプラインを利用します。 カタログ エクスプローラーを使用して、UI でバッキング パイプラインの詳細を表示できます。 「カタログ エクスプローラーとは」を参照してください。
構文
{ CREATE OR REPLACE MATERIALIZED VIEW | CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] }
view_name
[ column_list ]
[ view_clauses ]
AS query
column_list
( { column_name column_type column_properties } [, ...]
[ , table_constraint ] [...])
column_properties
{ NOT NULL | COMMENT column_comment | column_constraint | MASK clause } [ ... ]
view_clauses
{ PARTITIONED BY (col [, ...]) |
CLUSTER BY clause |
COMMENT view_comment |
DEFAULT COLLATION UTF8_BINARY |
TBLPROPERTIES clause |
SCHEDULE [ REFRESH ] schedule_clause |
schedule |
WITH { ROW FILTER clause } } [...]
schedule
{ SCHEDULE [ REFRESH ] schedule_clause |
TRIGGER ON UPDATE [ AT MOST EVERY trigger_interval ] }
schedule_clause
{ EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS } |
CRON cron_string [ AT TIME ZONE timezone_id ] }
パラメーター
取り替える
指定すると、ビューとその内容が既に存在する場合は置き換えられます。
存在しない場合
ビューが存在しない場合は作成します。 この名前のビューが既に存在する場合、
CREATE MATERIALIZED VIEWステートメントは無視されます。IF NOT EXISTSかOR REPLACEのいずれか 1 つだけを指定できます。-
新しく作成されたビューの名前。 完全修飾のビュー名は一意にする必要があります。
column_list
必要に応じて、ビューのクエリ結果内の列にラベルを付けます。 列の一覧を指定する場合は、列の別名の数がクエリ内の式の数と一致している必要があります。 列リストが指定されていない場合、別名はビューの本体から派生します。
-
列名は一意である必要があり、かつクエリの出力列にマップされている必要があります。
列タイプ
列のデータ型を指定します。 Azure Databricks でサポートされているすべてのデータ型が、すべての具体化されたビューでサポートされているわけではありません。
column_comment
列を記述する任意の
STRINGリテラル。 このオプションは、column_typeと共に指定する必要があります。 列の種類が指定されていない場合、列コメントはスキップされます。column_constraint
情報主キーまたは情報外部キーの制約を、具体化されたビューの列に追加します。 列の種類が指定されていない場合、列制約はスキップされます。
-
列マスク関数を追加して機密データを匿名化します。 その列の後続のすべてのクエリは、列の元の値の代わりに、その列に対してその関数を評価した結果を受け取ります。 これは、値を編集するかどうかを決定するために関数で呼び出し元ユーザーの ID またはグループ メンバーシップを検査できる、きめ細かいアクセス制御の目的に役立ちます。 列の種類が指定されていない場合、列マスクはスキップされます。
-
テーブル制約
情報主キーまたは情報外部キーの制約を、具体化されたビューのテーブルに追加します。 列の種類が指定されていない場合、テーブル制約はスキップされます。
view_clauses
必要に応じて、パーティション分割、コメント、ユーザー定義プロパティ、更新スケジュールを新しい具体化されたビューに対して指定します。 各サブ句は、1 回だけ指定できます。
-
テーブルをパーティション分割する基準となる、テーブルの列の一覧 (省略可能)。
注
液体クラスタリングは、クラスタリング用の柔軟で最適化されたソリューションを提供します。 具体化されたビューに
CLUSTER BYする代わりに、PARTITIONED BYを使用することを検討してください。 -
列のサブセットによってクラスター化する省略可能な句。
CLUSTER BY AUTOで自動液体クラスタリングを使用し、Databricks はクエリのパフォーマンスを最適化するためにクラスタリング キーをインテリジェントに選択します。 表に液体クラスタリングを使用するを参照してください。液体クラスタリングを
PARTITIONED BYと組み合わせることはできません。 コメント view_comment
テーブルについて説明する
STRINGリテラル。既定の照合順序UTF8_BINARY
適用対象:
Databricks SQL
Databricks Runtime 17.1 以降" とマークされているチェック物理化ビューの既定の照合順序を
UTF8_BINARYに強制設定します。 ビューが作成されるスキーマにUTF8_BINARY以外の既定の照合順序がある場合、この句は必須です。 具体化されたビューの既定の照合順序は、ビュー本文内の既定の照合順序として使用されます。-
必要に応じて、1 つ以上のユーザー定義プロパティを設定します。
この設定を使用して、このステートメントの実行に使用する Lakeflow Spark 宣言パイプライン ランタイム チャネルを指定します。
pipelines.channelプロパティの値を"PREVIEW"または"CURRENT"に設定します。 既定値は"CURRENT"です。 Lakeflow Spark 宣言パイプライン チャネルの詳細については、「 Lakeflow Spark 宣言パイプライン ランタイム チャネル」を参照してください。 schedule
スケジュールには、
SCHEDULEステートメントまたはTRIGGERステートメントのいずれかを指定できます。スケジュール [ REFRESH ] スケジュール条項
EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS }定期的に発生する更新をスケジュールするには、
EVERY構文を使用します。EVERY構文を指定した場合、ストリーミング テーブルまたは具体化されたビューは、指定した値 (HOUR、HOURS、DAY、DAYS、WEEK、またはWEEKSなど) に基づく指定の間隔で定期的に更新されます。 次の表に、numberに使用できる整数値を示します。時間単位 整数値 HOUR or HOURS1 <= H <= 72 DAY or DAYS1<= D<= 31 WEEK or WEEKS1 <= W <= 8 注
含まれる時間単位の単数形と複数形は、意味的に同等です。
CRON cron_string [ AT TIME ZONE timezone_id ]quartz cron 値を使用して更新をスケジュールします。 有効な time_zone_values が受け入れられます。
AT TIME ZONE LOCALはサポートされていません。AT TIME ZONEが存在しない場合は、セッション タイム ゾーンが使用されます。AT TIME ZONEが存在せず、セッション タイム ゾーンも設定されていない場合は、エラーがスローされます。SCHEDULEは、SCHEDULE REFRESHと同じ意味です。
トリガーオン UPDATE [ 最大ですべてのtrigger_interval ]
重要
TRIGGER ON UPDATE機能はベータ版です。必要に応じて、アップストリーム データ ソースが更新されたときに更新するようにテーブルを設定します (最大 1 分ごとに)。
AT MOST EVERYの値を設定して、更新の間に少なくとも最小限の時間を必要とします。アップストリーム データ ソースは、外部またはマネージド Delta テーブル (具体化されたビューやストリーミング テーブルを含む) か、依存関係がサポートされているテーブルの種類に制限されているマネージド ビューである必要があります。
ファイル イベントを有効にすると、トリガーのパフォーマンスが向上し、トリガーの更新の制限の一部が増える可能性があります。
trigger_intervalは、少なくとも 1 分の INTERVAL ステートメントです。TRIGGER ON UPDATEには次の制限があります- TRIGGER ON UPDATEを使用する場合、具体化ビューあたり最大10個のアップストリームデータソースが許可されていません。
- TRIGGER ON UPDATEでは、最大 1,000 個のストリーミング テーブルまたは具体化されたビューを指定できます。
-
AT MOST EVERY句の既定値は 1 分で、1 分未満にすることはできません。
WITH ROW FILTER 句
行フィルター関数をテーブルに追加します。 そのテーブルからの後続のすべてのクエリは、関数によってブール値 TRUE に評価される行のサブセットを受け取ります。 これは、特定の行をフィルター処理するかどうかを決定するために関数で呼び出し元ユーザーの ID またはグループ メンバーシップを検査できる、きめ細かいアクセス制御の目的に役立ちます。
-
AS クエリ
ベース テーブルまたはその他のビューからビューを構築するクエリです。
必要なアクセス許可
具体化されたビュー (MV) を作成するユーザーは、MV の所有者であり、次のアクセス許可が必要です。
- MV によって参照されているベース テーブルに対する
SELECT特権。 - 親カタログに対する
USE CATALOG特権と、親スキーマに対するUSE SCHEMA特権。 - MV のスキーマに対する
CREATE MATERIALIZED VIEW特権。
ユーザーが MV を更新できるようになるためには、次のものが必要です。
- 親カタログに対する
USE CATALOG特権と、親スキーマに対するUSE SCHEMA特権。 - MV の所有権または MV に対する
REFRESH特権。 - MV の所有者は、MV によって参照されているベース テーブルに対する
SELECT特権を持っている必要があります。
ユーザーが MV のクエリを実行できるようになるためには、次のものが必要です。
- 親カタログに対する
USE CATALOG特権と、親スキーマに対するUSE SCHEMA特権。 - 具体化されたビューに対する
SELECT特権。
行フィルターと列マスク
行フィルターを使用すると、テーブル スキャンで行がフェッチされるたびにフィルターとして適用される関数を指定できます。 これらのフィルターにより、後続のクエリでフィルター述語が true と評価される行のみが返されるようになります。
列マスクを使用すると、テーブル スキャンが行をフェッチするたびに列の値をマスクできます。 その列に関連するすべての今後のクエリは、列の元の値を置き換えて、列に対して関数を評価した結果を受け取ります。
行フィルターと列マスクの使用方法の詳細については、「 行フィルターと列マスク」を参照してください。
行フィルターと列マスクの管理
具体化されたビューに対する行フィルターと列マスクは、CREATE ステートメントを通じて追加する必要があります。
行動
-
定義者として更新:
REFRESH MATERIALIZED VIEWステートメントが具体化されたビューを更新すると、行フィルター関数は定義者の権限 (テーブル所有者) で実行されます。 つまり、テーブルの更新では、具体化されたビューを作成したユーザーのセキュリティ コンテキストが使用されます。 -
クエリ: ほとんどのフィルターは定義者の権限で実行されますが、ユーザー コンテキスト (
CURRENT_USERやIS_MEMBERなど) をチェックする関数は例外です。 これらの関数は呼び出し元として実行されます。 この方法では、現在のユーザーのコンテキストに基づいて、ユーザー固有のデータ セキュリティとアクセス制御が適用されます。 - 行フィルターと列マスクを含むソース テーブルに対する具体化されたビューを作成する場合、具体化されたビューの更新は常に完全更新になります。 完全更新では、最新の定義を使用して、ソースで使用可能なすべてのデータが再処理されます。 これにより、ソース テーブルのセキュリティ ポリシーが最新のデータと定義に基づいて評価され、適用されるようになります。
監視
DESCRIBE EXTENDED、INFORMATION_SCHEMA、またはカタログ エクスプローラーを使用して、特定の具体化されたビューに適用される既存の行フィルターと列マスクを調べます。 この機能により、ユーザーは具体化されたビューに対するデータ アクセスと保護対策を監査および確認できます。
制限事項
- NULL 許容列に対する
sum集計を含む具体化されたビューで、最後の NULL 非許容値がその列から削除され、その列に残っているのがNULL値のみである場合、具体化されたビューの結果の集計値は、NULLではなくゼロを返します。 - 列参照に別名は必要ありません。 次の例のように、非列参照式には別名が必要です。
- 許可:
SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1 - 許可されない:
SELECT col1, SUM(col2) FROM t GROUP BY col1
- 許可:
- 有効なステートメントにするには、
NOT NULLをPRIMARY KEYと共に手動で指定する必要があります。 - 具体化されたビューでは、ID 列や代理キーはサポートされていません。
- 具体化されたビューでは、
OPTIMIZEおよびVACUUMコマンドはサポートされていません。 メンテナンスは自動的に行われます。 - 具体化されたビューでは、データ品質の制約を定義するための期待値はサポートされていません。
例
-- Create a materialized view if it doesn't exist
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies
AS SELECT mo.member_id, mb.full_name, mo.movie_title
FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;
-- Create and schedule a materialized view to be refreshed whenever the
-- upstream data is updated
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies
TRIGGER ON UPDATE
AS SELECT mo.member_id, mb.full_name, mo.movie_title
FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;
-- Create and schedule a materialized view to be refreshed every day.
-- Note: All columns in a GROUP BY need to be explicitly aliased
> CREATE MATERIALIZED VIEW daily_sales
COMMENT 'Daily sales numbers'
SCHEDULE EVERY 1 DAY
AS SELECT date AS date, sum(sales) AS sumOfSales
FROM table1
GROUP BY date;
-- Sets the runtime channel to "PREVIEW"
> CREATE MATERIALIZED VIEW mv_preview
TBLPROPERTIES(pipelines.channel = "PREVIEW")
AS SELECT * FROM RANGE(10)
-- Create a materialized view with a table constraint
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies(
member_id int NOT NULL,
full_name string,
movie_title string,
CONSTRAINT movie_pk PRIMARY KEY(member_id)
)
AS SELECT mo.member_id, mb.full_name, mo.movie_title
FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;
-- Create or replace the materialized view to remove the table constraint and add a partition
> CREATE OR REPLACE MATERIALIZED VIEW subscribed_movies
PARTITIONED BY (member_id)
AS SELECT mo.member_id, mb.full_name, mo.movie_title
FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;
-- Create a materialized view with a row filter and a column mask
> CREATE MATERIALIZED VIEW masked_view (
id int,
name string,
region string,
ssn string MASK catalog.schema.ssn_mask_fn
)
WITH ROW FILTER catalog.schema.us_filter_fn ON (region)
AS SELECT id, name, region, ssn
FROM employees;