キャッシュに保存されているクエリ結果を使用する
BigQuery はすべてのクエリ結果をテーブルに書き込みます。テーブルはユーザーが明示的に指定したテーブルか(宛先テーブル)、一時的なキャッシュ結果テーブルのいずれかです。一時的なキャッシュ結果テーブルは、ユーザー別、プロジェクト別に保持されます。一時的なテーブルにはストレージの費用がかかりませんが、永続的なテーブルにクエリ結果を書き込むと、そのデータの保存に対して課金されます。
インタラクティブ クエリとバッチクエリの両方を含むすべてのクエリの結果は、一部の例外を除いて、一時テーブルに約 24 時間キャッシュされます。
制限事項
クエリ キャッシュの使用には以下の制限があります。
- 同じクエリを重複して実行すると、BigQuery はキャッシュに保存された結果を再利用しようとします。キャッシュからデータを取得するには、重複するクエリテキストを元のクエリと同じにする必要があります。
- クエリ結果がキャッシュ結果テーブルに存続するためには、結果セットを最大レスポンス サイズよりも小さくする必要があります。サイズの大きな結果セットの管理について詳しくは、大きいクエリ結果を返すをご覧ください。
- キャッシュ結果テーブルは DML ステートメントのターゲットにできません。
- 現在のセマンティックでは可能ですが、キャッシュに保存された結果を依存ジョブの入力として使用することは推奨されません。たとえば、キャッシュ テーブルから結果を取得するクエリジョブを送信しないでください。その代わりに、結果を名前付き宛先テーブルに書き込んでください。簡単にクリーンアップできるよう、データセット レベルの
defaultTableExpirationMs
プロパティなどの機能でデータを一定期間後に自動的に期限切れにできます。
料金と割り当て
キャッシュに保存されたクエリ結果は一時テーブルとして保存されます。これらの一時テーブルのストレージには、課金されません。クエリ結果がキャッシュ結果テーブルから取得された場合、ジョブ統計プロパティ statistics.query.cacheHit
は true
として返され、そのクエリに対しては課金されません。キャッシュに保存された結果を使用したクエリは、課金の対象となりませんが、BigQuery の割り当てポリシーの対象にはなります。キャッシュに保存された結果を使用したクエリには、コスト削減に加えて、非常に高速であるという利点もあります。これは BigQuery が結果セットを計算する必要がないためです。
クエリのキャッシュの例外
次の場合、クエリ結果はキャッシュに保存されません。
- 宛先テーブルをジョブ構成、Google Cloud Console、
bq
コマンドライン ツール、または API で指定する場合 - 結果がキャッシュに保存された後で、参照するテーブルまたは論理ビューが変更された
- クエリによって参照されているいずれかのテーブルが最近ストリーミング挿入を受信していたとき(テーブルには書き込み最適化ストレージのデータが含まれている)。新しい行を受け取ったかどうかは問いません
CURRENT_TIMESTAMP()
やCURRENT_DATE
といった日時関数やSESSION_USER()
関数など、実行タイミングによって異なる値を返す非決定性関数がクエリで使用されている場合- ワイルドカードを使用して複数のテーブルに対してクエリを実行する場合
- キャッシュに保存された結果が期限切れとなった場合。通常、キャッシュのライフタイムは 24 時間ですが、キャッシュへの保存はベストエフォート式であり、すぐに無効になることがあります
- Cloud Storage 以外の外部データソースに対してクエリを実行する場合(Cloud Storage での GoogleSQL クエリでは、クエリ結果のキャッシュへの保存がサポートされています)。
- 列レベルのセキュリティで保護されているテーブルに対してクエリが実行される場合、結果はキャッシュに保存されないことがあります。
- 行レベルのセキュリティで保護されているテーブルに対してクエリが実行される場合、結果はキャッシュに保存されません。
キャッシュされた結果の保存方法
クエリを実行すると、一時的なキャッシュ結果テーブルは「匿名データセット」と呼ばれる特別なデータセットに作成されます。匿名データセットに対するアクセス権は、IAM リソース階層モデル(プロジェクトと組織の権限)から権限を継承する通常のデータセットとは異なり、データセット所有者に限られます。匿名データセットの所有者は、キャッシュされた結果を生成したクエリを実行したユーザーです。また、bigquery.jobs.create
権限がプロジェクトでチェックされ、ユーザーがプロジェクトにアクセスできることを確認します。
BigQuery は匿名データセットの共有をサポートしていません。クエリ結果を共有する場合は、匿名データセットに格納されたキャッシュ結果を使用しないでください。その代わりに、結果を名前付き宛先テーブルに書き込んでください。
クエリを実行するユーザーは、データセットとキャッシュ結果テーブルへの完全アクセス権を持っていますが、従属ジョブの入力としてそれらを使用することはおすすめしません。
匿名データセットの名前の先頭はアンダースコアです。これにより、Google Cloud Console のデータセットのリストで匿名データセットが非表示になります。bq
コマンドライン ツールまたは API を使用して、匿名データセットを一覧表示し、匿名データセットのアクセス制御を監査できます。
- データセット(匿名データセットを含む)を一覧表示する方法の詳細については、プロジェクト内のデータセットの一覧表示をご覧ください。
- 匿名データセットのアクセス制御を監査する方法の詳細については、データセットに関する情報の取得をご覧ください。
キャッシュに保存されている結果の取得を無効にする
[Use cached results] オプションでは、クエリ対象のテーブルが変更された場合を除いて、以前に実行された同じクエリの結果が再利用されます。キャッシュされた結果の使用が役立つのは、クエリを繰り返し実行する場合のみです。新規のクエリでは [Use cached results] オプションの効果がありませんが、デフォルトで有効になっています。
[Use cached results] オプションを無効にしてクエリを繰り返し実行すると、既存のキャッシュされた結果が上書きされます。この場合、BigQuery でクエリ結果を計算する必要があり、そのクエリに対して課金が発生します。これは、ベンチマークに非常に役立ちます。
キャッシュされた結果の取得を無効にしてクエリジョブの実行評価を強制的に行う場合は、クエリジョブの configuration.query.useQueryCache
プロパティを false
に設定します。
[キャッシュされた結果を使用] オプションを無効にするには:
コンソール
Google Cloud コンソールを開きます。
[BigQuery] ページに移動[クエリを新規作成] をクリックします。
[クエリエディタ] テキスト領域に有効な SQL クエリを入力します。
[展開] をクリックして、[クエリの設定] を選択します。
[キャッシュの設定] の [キャッシュに保存された結果を使用] をオフにします。
bq
クエリ キャッシュを上書きするには、nouse_cache
フラグを指定します。次の例では、BigQuery が既存のキャッシュされた結果を使用することなく、クエリを強制的に処理します。
bq query \
--nouse_cache \
--batch \
'SELECT
name,
count
FROM
`my-project`.mydataset.names_2013
WHERE
gender = "M"
ORDER BY
count DESC
LIMIT
6'
API
キャッシュに保存されている結果を使用せずにクエリを処理するには、query
ジョブ構成で useQueryCache
プロパティを false
に設定します。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートの Go の手順に沿って設定を行ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Java
キャッシュに保存されている結果を使用せずにクエリを処理するには、QueryJobConfiguration の作成時に setUseQueryCache を false
に設定します。
Node.js
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートの Node.js の手順に沿って設定を行ってください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。
BigQuery への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
PHP
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートの PHP の手順に沿って設定を行ってください。詳細については、BigQuery PHP API のリファレンス ドキュメントをご覧ください。
BigQuery への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートの Python の手順に沿って設定を行ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
キャッシュを確実に使用する
jobs.insert
メソッドを使用してクエリを実行する場合、キャッシュされた結果を使用できない限り、query
ジョブ構成の createDisposition
プロパティを CREATE_NEVER
に設定して、クエリジョブを強制的に失敗させることができます。
クエリ結果がキャッシュに存在しない場合は、NOT_FOUND
エラーが返されます。
bq
クエリ キャッシュからの結果を要求するには、--require_cache
フラグを使用します。次の例では、結果がキャッシュに存在する場合に、BigQuery でクエリを処理しています。
bq query \
--require_cache \
--batch \
'SELECT
name,
count
FROM
`my-project`.mydataset.names_2013
WHERE
gender = "M"
ORDER BY
count DESC
LIMIT
6'
API
キャッシュに保存されている既存の結果を使用してクエリを処理するには、query
ジョブ構成で createDisposition
プロパティを CREATE_NEVER
に設定します。
キャッシュの使用を検証する
BigQuery がキャッシュを使用して結果を返したかどうかを判定する方法は 2 つあります。
- Google Cloud コンソールの使用。[クエリ結果] に移動し、[ジョブ情報] をクリックします。[処理されたバイト数] には 0 B(キャッシュされた結果)と表示されます。
- BigQuery API の使用。
クエリ結果の
cacheHit
プロパティがtrue
に設定されます。
列レベルのセキュリティの影響
デフォルトでは、BigQuery はクエリ結果を 24 時間キャッシュに保存しますが、前述の例外があります。列レベルのセキュリティで保護されているテーブルに対するクエリはキャッシュに保存されない場合があります。BigQuery が結果をキャッシュに保存する場合は、24 時間のキャッシュ保存期間が適用されます。
ポリシータグに使用されている「Data Catalog のきめ細かい読み取り」のロールからグループまたはユーザーを削除しても、24 時間のキャッシュ保存は無効になりません。「Data Catalog のきめ細かい読み取り」アクセス コントロール グループへの変更はすぐに反映されますが、変更によってキャッシュが無効になることはありません。
ユーザーがクエリを実行しても、クエリ結果は画面に表示されたままになります。また、過去 24 時間以内にデータにアクセスできなくなった場合でも、キャッシュから結果を取得できます。
ユーザーがポリシータグの「Data Catalog のきめ細かい読み取り」のロールから削除されてから 24 時間は、以前に表示が許可されたデータのキャッシュ データにアクセスできます。行がテーブルに追加されると、結果がキャッシュに保存されても、追加された行は表示されません。