BigQueryで多段ビューのキャッシュの挙動をみてみる

2022.05.09

データアナリティクス事業本部の鈴木です。

今回はBigQueryで多段ビューを検索したときの、キャッシュの挙動について確認してみました。

BigQueryでは同じクエリを重複して実行すると、ユーザー別・プロジェクト別に保存されたキャッシュされた結果を利用することができます。

多段ビューは仕様の複雑化やパフォーマンスへの影響を招く可能性があるため、使う場面は選ばれますが、BigQueryではビューの検索結果もキャッシュされるため、選択肢の一つとして、どのような動きをするのか調べてみました。

準備

テーブル・ビューの作成

以下のようにテーブルとビューを作成します。

今回は3層になるようテーブルとビューを作ります。基本的に深い多段にはせず、ビューは2層程度までだろうと考え、合計3層で検証しました。

多段ビュー構成

まず、あらかじめsample_datasetという名前のデータセットを作っておき、テーブルを以下のように作りました。

CREATE TABLE sample_dataset.base_table
(
    id INTEGER,
    name STRING,
    price INTEGER
);

INSERT sample_dataset.base_table (id, name, price)
VALUES(1, 'Apple', 150),
      (2, 'Orange', 120),
      (3, 'Grape', 390);

出来上がったテーブル

続いてテーブルを参照する多段のビューを作成します。

CREATE VIEW sample_dataset.sample_view_1(id, name, price) AS
SELECT
  id,
  name,
  price
FROM
  sample_dataset.base_table;

CREATE VIEW sample_dataset.sample_view_2(id, name, price) AS
SELECT
  id,
  name,
  price
FROM
  sample_dataset.sample_view_1;

データセットはこのようになります。

データセット

やってみる

2層目のビューのキャッシュの利用

まず、2層目のビューを検索してみます。

SELECT * FROM sample_dataset.sample_view_2 LIMIT 100;

クエリ結果実行の詳細タブを確認すると、1回目は処理が行われていますが、2回目は-になっていることが分かります。

1回目

スキャン1回目

2回目

スキャン2回目

特に2回目は、ジョブ情報タブを開くと、処理されたバイト数0 B(キャッシュされた結果)になっているため、キャッシュが使われていることが分かります。

ジョブ情報

2層目のビューのリフレッシュ

先の検索で2層目のビューはキャッシュがありますが、0層目のテーブルが更新された際に、リフレッシュされるか気になるので確認してみました。

テーブルに追加のデータをInsertしてみます。

INSERT sample_dataset.base_table (id, name, price)
VALUES(4, 'Mango', 500);

テーブルはこのようになります。

データ追加後のテーブル

この状態で2層目のビューで検索してみます。

SELECT * FROM sample_dataset.sample_view_2 LIMIT 100;

前回同様、1回目は処理されますが、2回目はキャッシュを利用されることが分かりました。

1回目

スキャン1回目

2回目

スキャン2回目

最後に

今回はBigQueryで多段ビューをしたときの、キャッシュの挙動を確認してみました。多段でもキャッシュされること、テーブルが更新された際にはリフレッシュされることが分かりました。