イクジニアブログ

育児 + エンジニア = イクジニア

BigQuery 2022/1月のupdate情報まとめ

先日ブースター接種を終えたのですが、かなり副反応がきつかったですね。 オンラインMTGに出ることも出来ない状態でした・・・

それでは先月までに引き続き1月のまとめもいってみましょう!

nii-yan.hatenablog.com

JSON型が使用可能に

今まではSTRING型にJSONを入れて、JSON_QUERYなどで抽出をしていたと思われますが、JSON型を使うことで関数を使わずに手軽にJSONの値を参照可能になりました。
ドット表記や’[]’で配列にもアクセス可能可能です。
f:id:nii_yan:20220218163009p:plain f:id:nii_yan:20220218163030p:plain

※注意点 JSON関数とは直接関係ないですが、JSON_EXTACT_XXX系の関数はレガシー関数となっており、JSON_QUERYなどの標準関数への置き換えが推奨されています。

GCSなどからバッチ処理JSON型を読み込むときは CSV形式である必要があります。
(JSONファイルの読み込みは出来ない、CSVの1カラムがJSONであるイメージ)
f:id:nii_yan:20220218163301p:plain

SQLを使ってJSON型にデータを入れることも出来ますが、その際はJSONリテラルを使用して挿入します f:id:nii_yan:20220218163508p:plain

現状STRING型で入れているデータをJSONに変換しながらいれたいときはPARSE_JSONを使用します
(SAFEをつけると変換エラーの値がNULLとなる)
f:id:nii_yan:20220218163606p:plain

またパフォーマンス比較については、@ohsawa0515さんがこちらの資料にまとめてくだっています

speakerdeck.com

ロード時間がSTRINGで入れるよりは遅くなりますが、データの保存容量は少なくなりますし、読み込みも早くなるので積極的に使って行きたいですね!

JSON型ですが、現在はまだ誰でも使えるわけではなく、使いたい場合はこちらから申し込みが必要な機能となります。
皆さんぜひとも使ってみて下さい!

マテリアライズドビューが集約無しクエリに対応

※こちらはpreviewがGAになりました、以前にも紹介をしていましたが再掲となります。
今まではSUMやAVGなどの集約関数を使ったクエリでしかマテビューが作れなかったが、集約関数を使わなくてもマテビューが作成可能になりました。
クラスタ化や、フィルタリングの検証に使えます。
クラスタ化されたマテビューは、indexのように機能し、元テーブルに対してのクエリもマテビューからのデータを参照するようになります。

BigQueryではoracleのクエリリライトと同じような機能があり、a というテーブルを元に、 mv_a というマテビューを作った場合、 a に対するクエリでも mv_a を見たほうがクエリコストが低いとクエリオプティマイザが判断した場合、内部的に mv_a を参照される場合があります。

マテリアライズド ビューの概要

BigQuery は、事前に計算されたマテリアライズド ビューの結果を利用し、可能な場合にはベーステーブルからの差分のみを読み取って最新の結果を計算します。マテリアライズド ビューに直接クエリを発行できるのはもちろん、ベーステーブルに対するクエリを処理するために BigQuery オプティマイザーでマテリアライズド ビューを使用することもできます。

公式docでは以下のような例が記載されています

データの再クラスタ化

ベーステーブルと異なるクラスタリング スキームを使用したクエリの多くを発行する場合、マテリアライズド ビューを使用するとクエリのパフォーマンスが向上する可能性があります。

CREATE MATERIALIZED VIEW dataset.mv
CLUSTER BY y
AS SELECT * FROM dataset.base_table;

データの事前フィルタリング

テーブルの特定のサブセットのみを読み取るクエリを頻繁に実行する場合は、マテリアライズド ビューを使用してクエリのパフォーマンスを向上させることができます。

CREATE MATERIALIZED VIEW dataset.mv
CLUSTER BY x
AS SELECT * FROM dataset.base_table
WHERE y < 1000;

データの事前計算

コンピューティング コストが高い関数を頻繁に使用する場合や、大きな列から少量のデータを抽出する場合は、マテリアライズド ビューを使用するとクエリのパフォーマンスが向上します。

CREATE MATERIALIZED VIEW dataset.mv
AS SELECT x, JSON_EXTRACT(string_field, "$.subfield1.subfield2") subfield2
FROM dataset.base_table;

発行したクエリがマテビューを参照したかどうかはクエリプランのデータスキャン量などを見ると確認することが出来ます。

マテリアライズドビューが内部結合クエリに対応

※こちらはpreviewがGAになりました、以前にも紹介をしていましたが再掲となります。

今までは結合を使えなかったが、内部結合(inner join)を使ったクエリでもマテビューが作成可能になりました。
クロス結合、完全結合、左結合、右結合は非対応
ファクトテーブルとディメンションテーブルのように、頻繁にjoinされるテーブルのクエリはマテビューを作っておくことでパフォーマンス改善が可能に
(テーブルの参照順はviewとクエリで同一でなければいけない)

1月のリリースは以上となります。また来月まとめたいと思います!!