Im Cache gespeicherte Abfrageergebnisse verwenden

BigQuery schreibt alle Abfrageergebnisse in eine Tabelle. Die Tabelle wird entweder vom Nutzer explizit angegeben (Zieltabelle) oder ist eine temporäre, im Cache gespeicherte Ergebnistabelle. Wenn Sie die exakt gleiche Abfrage noch einmal ausführen, gibt BigQuery die Ergebnisse aus der im Cache gespeicherten Tabelle zurück, sofern vorhanden. Temporäre, im Cache gespeicherte Ergebnistabellen werden nutzer- und projektspezifisch verwaltet. Je nach Version haben Sie möglicherweise Zugriff auf im Cache gespeicherte Ergebnisse von anderen Nutzern, die Abfragen im selben Projekt ausführen. Für im Cache gespeicherte Tabellen mit Abfrageergebnissen fallen keine Speicherkosten an. Wenn Sie jedoch Abfrageergebnisse in eine permanente Tabelle schreiben, wird das Speichern der Daten in Rechnung gestellt.

Alle Abfrageergebnisse, sowohl für interaktive Abfragen als auch für Batchabfragen, werden etwa 24 Stunden lang in temporären Tabellen im Cache gespeichert. Dafür gelten einige Ausnahmen.

Beschränkungen

Bei der Verwendung des Abfrage-Cache gelten folgende Einschränkungen:

  • Wenn Sie eine Abfrage mehrfach ausführen, versucht BigQuery, im Cache gespeicherte Ergebnisse wiederzuverwenden. Der duplizierte Abfragetext muss mit der ursprünglichen Abfrage übereinstimmen, um Daten aus dem Cache abzurufen.
  • Damit Abfrageergebnisse in einer im Cache gespeicherten Ergebnistabelle erhalten bleiben, muss der Ergebnissatz kleiner als die maximale Antwortgröße sein. Weitere Informationen zum Verwalten großer Ergebnissätze finden Sie unter Umfangreiche Abfrageergebnisse schreiben.
  • Sie können nicht mithilfe von DML-Anweisungen auf im Cache gespeicherte Ergebnistabellen zugreifen.
  • Obwohl die aktuelle Semantik es zulässt, wird davon abgeraten, im Cache gespeicherte Ergebnisse als Eingabe für abhängige Jobs zu verwenden. Sie sollten z. B. keine Abfragejobs senden, mit denen Ergebnisse aus der Cachetabelle abgerufen werden. Schreiben Sie Ihre Ergebnisse stattdessen in eine benannte Zieltabelle. Mit Features wie dem Attribut defaultTableExpirationMs auf Dataset-Ebene kann dafür gesorgt werden, dass Daten nach einem bestimmten Zeitraum automatisch ablaufen, um die Bereinigung zu vereinfachen.

Preise und Kontingente

Im Cache gespeicherte Abfrageergebnisse werden als temporäre Tabellen gespeichert. Für die Speicherung von im Cache gespeicherten Abfrageergebnissen in temporären Tabellen fallen keine Kosten an. Wenn Abfrageergebnisse aus einer im Cache gespeicherten Ergebnistabelle abgerufen werden, wird für das Jobstatistikattribut statistics.query.cacheHit der Wert true zurückgegeben. Diese Abfrage wird Ihnen nicht in Rechnung gestellt. Obwohl Abfragen, für die im Cache gespeicherte Ergebnisse verwendet werden, für Sie kostenlos sind, unterliegen sie den BigQuery-Kontingentrichtlinien. Mit Abfragen, für die im Cache gespeicherte Ergebnisse verwendet werden, können nicht nur die Kosten gesenkt werden. Sie sind auch deutlich schneller, weil BigQuery nicht den Ergebnissatz zu berechnen braucht.

Ausnahmen für das Abfrage-Caching

Abfrageergebnisse werden unter den folgenden Bedingungen nicht im Cache gespeichert:

  • Wenn in der Jobkonfiguration, der Google Cloud Console, dem bq-Befehlszeilentool oder der API eine Zieltabelle angegeben ist.
  • Angegebene Tabellen oder logische Ansichten wurden geändert, seit die Ergebnisse im Cache gespeichert wurden.
  • Wenn in der Abfrage angegebene Tabellen kürzlich Streaming-Insert-Anweisungen erhalten haben (Tabelle enthält Daten im schreiboptimierten Speicher), auch wenn keine neuen Zeilen angekommen sind.
  • In der Abfrage werden nicht deterministische Funktionen verwendet, z. B. Funktionen für Datum und Uhrzeit wie CURRENT_TIMESTAMP() und CURRENT_DATE. Andere Funktionen wie SESSION_USER() geben je nach Ausführungszeitpunkt einer Abfrage unterschiedliche Werte zurück.
  • Sie fragen mehrere Tabellen mit einem Platzhalter ab.
  • Die im Cache gespeicherten Ergebnisse sind abgelaufen. Die typische Aufbewahrungsdauer im Cache beträgt 24 Stunden. Im Cache gespeicherte Ergebnisse werden aber auf Best-Effort-Basis bereitgestellt und können auch früher ungültig werden.
  • Wenn die Abfrage nicht in Cloud Storage mit einer externen Datenquelle ausgeführt wird. (GoogleSQL-Abfragen in Cloud Storage werden durch im Cache gespeicherte Abfrageergebnisse unterstützt.)
  • Wenn die Abfrage für eine durch Sicherheit auf Spaltenebene geschützte Tabelle ausgeführt wird, werden die Ergebnisse möglicherweise nicht im Cache gespeichert.
  • Wenn die Abfrage für eine durch Sicherheit auf Zeilenebene geschützte Tabelle ausgeführt wird, werden die Ergebnisse nicht im Cache gespeichert.

Im Cache gespeicherte Ergebnisse speichern

Wenn Sie eine Abfrage ausführen, wird eine temporäre, im Cache gespeicherte Ergebnistabelle in einem besonderen Typ von ausgeblendetem Dataset erstellt, das als anonymes Dataset bezeichnet wird. Im Gegensatz zu regulären Datasets, die Berechtigungen vom Modell der IAM-Ressourcenhierarchie (Projekt- und Organisationsberechtigungen) übernehmen, ist der Zugriff auf anonyme Datasets auf die jeweiligen Eigentümer beschränkt. Der Eigentümer eines anonymen Datasets ist der Nutzer, der die Abfrage ausgeführt hat, die das im Cache gespeicherte Ergebnis zurückgegeben hat. Darüber hinaus wird für das Projekt die Berechtigung bigquery.jobs.create geprüft, um zu verifizieren, ob der Nutzer Zugriff auf das Projekt hat.

BigQuery unterstützt die Freigabe anonymer Datasets nicht. Wenn Sie vorhaben, Abfrageergebnisse mit anderen Nutzern zu teilen, sollten Sie keine im Cache gespeicherten Ergebnisse aus einem anonymen Dataset verwenden. Schreiben Sie die Ergebnisse stattdessen in eine benannte Zieltabelle.

Obwohl der Nutzer, der die Abfrage ausführt, uneingeschränkten Zugriff auf das Dataset und die im Cache gespeicherte Ergebnistabelle hat, wird davon abgeraten, diese als Eingabe für abhängige Jobs zu verwenden.

Die Namen eines anonymen Datasets beginnen mit einem Unterstrich. Dadurch werden sie in der Dataset-Liste der Google Cloud Console ausgeblendet. Mit dem bq-Befehlszeilentool oder der API können Sie anonyme Datasets auflisten und Zugriffssteuerungen für anonyme Datasets prüfen.

Weitere Informationen zum Auflisten und Abrufen von Informationen zu Datasets, einschließlich anonymer Datasets, finden Sie unter Datasets auflisten.

Nutzerübergreifendes Caching

Wenn Sie die Enterprise oder Enterprise Plus Version verwenden und die erforderlichen Berechtigungen zum Ausführen einer Abfrage haben, die in Ihrem Projekt für einen anderen Nutzer im Cache gespeichert ist, generiert BigQuery das im Cache gespeicherte Ergebnis. Das im Cache gespeicherte Ergebnis wird in Ihr persönliches anonymes Dataset kopiert und verbleibt dort bis 24 Stunden nach dem Ausführen der Abfrage. Für nutzerübergreifendes Caching gelten die gleichen Limits und Ausnahmen wie für das Caching einzelner Nutzer.

Abruf von im Cache gespeicherten Ergebnissen deaktivieren

Mit der Option Im Cache gespeicherte Ergebnisse verwenden werden Ergebnisse aus einer früheren Ausführung der gleichen Abfrage wiederverwendet, sofern sich die abgefragten Tabellen nicht geändert haben. Die Verwendung von im Cache gespeicherten Ergebnissen ist nur bei wiederholten Abfragen sinnvoll. Bei neuen Abfragen hat die Option Im Cache gespeicherte Ergebnisse verwenden keine Wirkung, auch wenn sie standardmäßig aktiviert ist.

Wenn Sie eine Abfrage bei deaktivierter Option Im Cache gespeicherte Ergebnisse verwenden wiederholen, wird das vorhandene im Cache gespeicherte Ergebnis überschrieben. BigQuery muss dann das Abfrageergebnis neu berechnen und die Abfrage wird Ihnen in Rechnung gestellt. Dies ist insbesondere in Benchmark-Szenarien hilfreich.

Wenn Sie das Abrufen von im Cache gespeicherten Ergebnissen deaktivieren und eine Liveauswertung eines Abfragejobs erzwingen möchten, können Sie das Attribut configuration.query.useQueryCache Ihres Abfragejobs auf false setzen.

So deaktivieren Sie die Option Im Cache gespeicherte Ergebnisse verwenden:

Console

  1. Öffnen Sie die Google Cloud Console.
    Zur Seite „BigQuery“

  2. Klicken Sie auf Neue Abfrage erstellen.

  3. Geben Sie im Textbereich des Abfrageeditors eine gültige SQL-Abfrage ein.

  4. Klicken Sie auf Mehr und wählen Sie Abfrageeinstellungen.

    Abfrageeinstellungen

  5. Deaktivieren Sie unter Cache-Einstellung die Option Im Cache gespeicherte Ergebnisse verwenden.

bq

Verwenden Sie das Flag nouse_cache, um den Abfrage-Cache zu überschreiben. Im folgenden Beispiel wird BigQuery gezwungen, die Abfrage zu verarbeiten, ohne die vorhandenen, im Cache gespeicherten Ergebnisse zu verwenden:

 bq query \
 --nouse_cache \
 --batch \
 'SELECT
    name,
    count
  FROM
    `my-project`.mydataset.names_2013
  WHERE
    gender = "M"
  ORDER BY
    count DESC
  LIMIT
    6'

API

Wenn eine Abfrage ohne Verwendung der im Cache gespeicherten Ergebnisse verarbeitet werden soll, setzen Sie in der query-Jobkonfiguration das Attribut useQueryCache auf false.

Go

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Go in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Go API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
)

// queryDisableCache demonstrates issuing a query and requesting that the query cache is bypassed.
func queryDisableCache(w io.Writer, projectID string) error {
	// projectID := "my-project-id"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	q := client.Query(
		"SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;")
	q.DisableQueryCache = true
	// Location must match that of the dataset(s) referenced in the query.
	q.Location = "US"

	// Run the query and print results when the query job is completed.
	job, err := q.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	it, err := job.Read(ctx)
	for {
		var row []bigquery.Value
		err := it.Next(&row)
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		fmt.Fprintln(w, row)
	}
	return nil
}

Java

Soll eine Abfrage ausgeführt werden, ohne die im Cache gespeicherten Ergebnisse zu verwenden, legen Sie für „useQueryCache“ beim Erstellen einer QueryJobConfiguration den Wert false fest.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;

// Sample to running a query with the cache disabled.
public class QueryDisableCache {

  public static void runQueryDisableCache() {
    String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
    queryDisableCache(query);
  }

  public static void queryDisableCache(String query) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      QueryJobConfiguration queryConfig =
          QueryJobConfiguration.newBuilder(query)
              // Disable the query cache to force live query evaluation.
              .setUseQueryCache(false)
              .build();

      TableResult results = bigquery.query(queryConfig);

      results
          .iterateAll()
          .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));

      System.out.println("Query disable cache performed successfully.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

Node.js

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Node.js in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Node.js API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');

async function queryDisableCache() {
  // Queries the Shakespeare dataset with the cache disabled.

  // Create a client
  const bigquery = new BigQuery();

  const query = `SELECT corpus
    FROM \`bigquery-public-data.samples.shakespeare\`
    GROUP BY corpus`;
  const options = {
    query: query,
    // Location must match that of the dataset(s) referenced in the query.
    location: 'US',
    useQueryCache: false,
  };

  // Run the query as a job
  const [job] = await bigquery.createQueryJob(options);
  console.log(`Job ${job.id} started.`);

  // Wait for the query to finish
  const [rows] = await job.getQueryResults();

  // Print the results
  console.log('Rows:');
  rows.forEach(row => console.log(row));
}

PHP

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von PHP in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery PHP API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $query = 'SELECT id, view_count FROM `bigquery-public-data.stackoverflow.posts_questions`';

// Construct a BigQuery client object.
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);

// Set job configs
$jobConfig = $bigQuery->query($query);
$jobConfig->useQueryCache(false);

// Extract query results
$queryResults = $bigQuery->runQuery($jobConfig);

$i = 0;
foreach ($queryResults as $row) {
    printf('--- Row %s ---' . PHP_EOL, ++$i);
    foreach ($row as $column => $value) {
        printf('%s: %s' . PHP_EOL, $column, json_encode($value));
    }
}
printf('Found %s row(s)' . PHP_EOL, $i);

Python

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Python in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Python API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

job_config = bigquery.QueryJobConfig(use_query_cache=False)
sql = """
    SELECT corpus
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY corpus;
"""
query_job = client.query(sql, job_config=job_config)  # Make an API request.

for row in query_job:
    print(row)

Verwendung des Cache gewährleisten

Wenn Sie zur Ausführung von Abfragen die Methode jobs.insert verwenden, können Sie erzwingen, dass Abfragejobs fehlschlagen, wenn keine im Cache gespeicherten Ergebnisse verwendet werden können. Legen Sie dazu das Attribut createDisposition der query-Jobkonfiguration auf CREATE_NEVER fest.

Wenn das Abfrageergebnis im Cache nicht existiert, wird ein NOT_FOUND-Fehler zurückgegeben.

bq

Verwenden Sie das Flag --require_cache, um Ergebnisse aus dem Abfragecache anzufordern. Im folgenden Beispiel wird BigQuery gezwungen, die Abfrage zu verarbeiten, wenn die Ergebnisse im Cache vorhanden sind:

 bq query \
 --require_cache \
 --batch \
 'SELECT
    name,
    count
  FROM
    `my-project`.mydataset.names_2013
  WHERE
    gender = "M"
  ORDER BY
    count DESC
  LIMIT
    6'

API

Zur Verarbeitung einer Abfrage mit vorhandenen im Cache gespeicherten Ergebnissen legen Sie für das Attribut createDisposition in der query-Jobkonfiguration CREATE_NEVER fest.

Verwendung des Cache überprüfen

Es gibt zwei Möglichkeiten festzustellen, ob BigQuery ein Ergebnis aus dem Cache zurückgegeben hat:

  • Google Cloud Console verwenden Gehen Sie zu Abfrageergebnisse und klicken Sie auf Jobinformationen. Verarbeitete Byte zeigt 0 B (Ergebnisse im Cache) an.
  • BigQuery API verwenden. Das Attribut cacheHit im Abfrageergebnis ist auf true gesetzt.

Auswirkungen der Sicherheit auf Spaltenebene

Standardmäßig speichert BigQuery Abfrageergebnisse 24 Stunden lang im Cache, mit den zuvor genannten Ausnahmen. Abfragen für eine durch Sicherheit auf Spaltenebene geschützte Tabelle werden möglicherweise nicht im Cache gespeichert. Wenn BigQuery das Ergebnis im Cache speichert, gilt die 24-Stunden-Cache-Lebensdauer.

Eine Änderung, z. B. das Entfernen einer Gruppe oder eines Nutzers aus der Rolle detaillierter Lesezugriff für Data Catalog, die für ein Richtlinien-Tag verwendet wird, macht den 24-Stunden-Cache nicht ungültig. Eine Änderung an der Zugriffssteuerungsgruppe detaillierter Lesezugriff für Data Catalog selbst wird sofort übernommen, aber der Cache wird dadurch nicht ungültig.

Dies hat zur Folge, dass durch die Abfrage die Abfrageergebnisse für den Nutzer auf dem Bildschirm sichtbar bleiben. Der Nutzer kann diese Ergebnisse auch dann aus dem Cache abrufen, selbst wenn er innerhalb der letzten 24 Stunden den Zugriff auf die Daten verloren hat.

In den 24 Stunden nach der Entfernung eines Nutzers aus der Rolle Detaillierter Lesezugriff für Data Catalog für ein Richtlinien-Tag hat der Nutzer nur Zugriff auf die im Cache gespeicherten Daten, die ihm zuvor angezeigt wurden. Wenn Zeilen zur Tabelle hinzugefügt werden, sieht der Nutzer die hinzugefügten Zeilen nicht, selbst wenn die Ergebnisse im Cache gespeichert werden.