👋

BigQueryの Non-incremental Materialized viewsがプレビューになりました

2023/05/22に公開

はじめに

こんにちは、クラウドエース データML ディビジョン所属の中村です。
クラウドエースのITエンジニアリングを担うシステム開発部の中で、特にデータ基盤構築・分析基盤構築からデータ分析までを含む一貫したデータ課題の解決を専門とするのがデータML ディビジョンです。

データML ディビジョンでは活動の一環として、毎週Google Cloud の新規リリースを調査・発表し、データ領域のプロダクトのキャッチアップをしています。その中でも重要と考えるリリースを本ページ含め記事として公開しています。

今回紹介するリリースは、BigQueryの「Non-incremental Materialized views」についてです。
このリリースにより、マテリアライズドビュー作成時にOUTER JOINやUNION、HAVING等ほとんどのSQLクエリが使用できるようになりました。
なお、この機能はプレビュー段階です。

BigQuery の概要

BigQuery はサーバーレスアーキテクチャによりSQLクエリを使用して、インフラストラクチャ管理なしで大きな課題に対応できるフルマネージドのエンタープライズデータウェアハウスです。
詳しくはこちらをご参照ください
URL: BigQuery 概要

今回のリリースについて

今回ご紹介するのは2023年4月5日付に発表されたBigQueryのNon-incremental Materialized viewsという機能についてです。
URL: BigQuery release notes

リリース概要

Non-incremental Materialized viewsではOUTER JOINやUNION、HAVING等ほとんどのSQLクエリをサポートしています。
バッチデータ処理やレポートなどデータの未更新が許容されるケースで使用することで、クエリのパフォーマンスを向上しコストを削減することが可能です。

使い方

マテリアライズドビュー作成時、DDLステートメントにOPTIONS句を追加しallow_non_incremental_definitionオプションをtrueにすることで使用できます。
また、Non-incremental Materialized viewsを使用するときはmax_stalenessも指定する必要があります。
max_stalenessはマテリアライズドビューが古くなることを許容する時間間隔を表します。
つまり、参照するのが古いデータでも問題ない場合、max_stalenessを長く設定できます。
max_stalenessについての詳細はこちらのドキュメントからご確認ください。
URL: max_staleness

試してみた

BigQueryでNon-incremental Materialized viewsを実際に試してみます。
なお、結果が更新されないことがあるため、以下の手順でキャッシュは無効にしておきます。
BigQueryキャッシュの無効化

1. サンプルテーブルを作成

以下のクエリで2つのサンプルテーブルを作成します。

-- table1
-- 「sample_table1」テーブルを作成する
CREATE TABLE
  -- 「xxx」:プロジェクトIDを指定
  -- 「sample_dataset」:プロジェクトID内のデータセットを指定
  -- 「sample_table1」:作成するテーブル名
  `xxx.sample_dataset.sample_table1` ( id INT64,
    store_name STRING,
    location_id INT64);

-- 「sample_table1」テーブルにデータを追加する
INSERT INTO
  `xxx.sample_dataset.sample_table1` ( id,
    store_name,
    location_id)
VALUES
  (1,"A店",1),
  (2,"B店",2),
  (3,"C店",2),
  (4,"D店",5) ;

-- table2
-- 「sample_table2」テーブルを作成する
CREATE TABLE
  `xxx.sample_dataset.sample_table2` ( id INT64,
    location STRING);

-- 「sample_table2」テーブルにデータを追加する
INSERT INTO
  `xxx.sample_dataset.sample_table2` ( id,
    location)
VALUES
  (1,"東京"),
  (2,"大阪"),
  (3,"札幌")

2. マテリアライズドビューを作成

以下のクエリでマテリアライズドビューを作成します。
max_stalenessは30分を設定しました。

CREATE MATERIALIZED VIEW
  `xxx.sample_dataset.sample_table.view1` OPTIONS ( enable_refresh = TRUE,
    refresh_interval_minutes = 30,
    allow_non_incremental_definition = TRUE,
    max_staleness = INTERVAL "0:30:0" HOUR TO SECOND ) AS
SELECT
  sample1.id,
  store_name,
  location
FROM
  `xxx.sample_dataset.sample_table1` AS sample1
FULL OUTER JOIN
  `xxx.sample_dataset.sample_table2` AS sample2
ON
  sample1.location_id = sample2.id

3. データを確認

想定通りにFULL OUTER JOINできていることがわかります。

SELECT
  *
FROM
  `xxx.sample_dataset.sample_table.view1`


+------+------------+----------+  
|  id  | store_name | location |  
+------+------------+----------+  
|    2 | B店        | 大阪      |  
|    3 | C店        | 大阪      |  
|    4 | D店        | NULL     |  
|    1 | A店        | 東京      |  
| NULL | NULL       | 札幌     |  
+------+------------+----------+  

4. テーブルからデータを削除

1で作成したテーブルのデータを一部削除し、確認します。

DELETE
FROM
  `xxx.sample_dataset.sample_table1`
WHERE
  id=1;

SELECT
  *
FROM
  `xxx.sample_dataset.sample_table1`


+----+------------+-------------+  
| id | store_name | location_id |  
+----+------------+-------------+  
|  3 | C店        |           2 |  
|  2 | B店        |           2 |  
|  4 | D店        |           5 |  
+----+------------+-------------+  

テーブルが更新されていることが確認できます。

5. マテリアライズドビューの確認

マテリアライズドビューの方も確認します。

SELECT
  *
FROM
  `xxx.sample_dataset.sample_table.view1`
+------+------------+----------+  
|  id  | store_name | location |  
+------+------------+----------+  
|    2 | B店        | 大阪      |  
|    3 | C店        | 大阪      |  
|    4 | D店        | NULL     |  
|    1 | A店        | 東京      |  
| NULL | NULL       | 札幌     |  
+------+------------+----------+  

すぐには結果は反映されていませんが、30分後に確認すると更新されていました。

SELECT
  *
FROM
  `xxx.sample_dataset.sample_table.view1`
+------+------------+----------+
|  id  | store_name | location |
+------+------------+----------+
|    4 | D店        | NULL     |
|    2 | B店        | 大阪      |
|    3 | C店        | 大阪      |
| NULL | NULL       | 札幌     |  
| NULL | NULL       | 東京     |
+------+------------+----------+

6. 処理されたバイト数およびシャッフルされたバイト数の確認

マテリアライズドビューと直接クエリを実行した場合の結果を比較してみます。
クエリはマテリアライズドビューを作成した時と同じものを実行します。

SELECT
  sample1.id,
  store_name,
  location
FROM
  `xxx.sample_dataset.sample_table1` AS sample1
FULL OUTER JOIN
  `xxx.sample_dataset.sample_table2` AS sample2
ON
  sample1.location_id = sample2.id

+------+------------+----------+
|  id  | store_name | location |
+------+------------+----------+
|    4 | D店        | NULL     |
|    2 | B店        | 大阪      |
|    3 | C店        | 大阪      |
| NULL | NULL       | 札幌     |  
| NULL | NULL       | 東京     |
+------+------------+----------+

結果は5と同じことが確認できます。

実行結果は以下のようになりました。

処理されたバイト数(B) 消費したスロット時間(ミリ秒) シャッフルされたバイト数(B)
マテリアライズドビュー 74 40 93
クエリ実行 130 1000 234

クエリを実行した時と比較して、マテリアライズドビューは処理データが抑えられているのが確認できます。

まとめ

今回の記事ではBigQueryのNon-incremental Materialized viewsについてご紹介しました。
Non-incremental Materialized viewsを設定することで、マテリアライズドビューで使用できる句が増えて使いやすくなりました。
プレビュー段階ではありますが、設定は簡単に行うことができるのでぜひお試しください。

Discussion