FAQ zu materialisierten Ansichten

Diese Seite enthält Antworten auf häufig gestellte Fragen zu materialisierten Ansichten in BigQuery.

Wann sollte ich geplante Abfragen und wann materialisierte Ansichten verwenden?

Geplante Abfragen sind eine praktische Möglichkeit, beliebig komplexe Berechnungen regelmäßig durchzuführen. Eine solche Abfrage wird dabei immer vollständig ausgeführt. Die vorherigen Ergebnisse werden nicht verwendet und Sie zahlen den vollen Preis für die Abfrage. Geplante Abfragen eignen sich hervorragend, wenn Sie nicht die neuesten Daten benötigen und wenn eventuell veraltete Daten kein Problem darstellen.

Materialisierte Ansichten sind gut geeignet, wenn Sie immer die neuesten Daten abfragen und gleichzeitig Latenz sowie Kosten reduzieren möchten. Dazu können Sie das zuvor berechnete Ergebnis wiederverwenden. Materialisierte Ansichten lassen sich als Pseudoindexe nutzen, um Abfragen der Basistabelle zu beschleunigen, ohne bestehende Workflows zu ändern.

Als allgemeine Richtlinie gilt: Verwenden Sie materialisierte Ansichten, wann immer möglich und wenn keine beliebig komplexen Berechnungen ausgeführt werden müssen.

Wie lange dauert es, bis bei einer Abfrage der materialisierten Ansicht eine Änderung der Basistabelle berücksichtigt wird?

Das erfolgt sofort. Unabhängig davon, ob Sie in die Basistabelle streamen, massenhaft Daten darin laden oder eine Abfrage ausführen, durch die das Ergebnis in die Basistabelle geschrieben wird, wird der neue Tabellenstatus sofort angezeigt, wenn Sie die Abfrage ausführen. Dies gilt unabhängig davon, ob Sie eine materialisierte Ansicht über die Basistabelle abfragen oder die Basistabelle direkt abfragen und der Ausführungsplan die materialisierte Ansicht nutzt.

Wie oft wird eine materialisierte Ansicht aktualisiert?

Jede materialisierte Ansicht wird automatisch aktualisiert, also neu berechnet, wenn sich die Basistabelle ändert. Zwischen jeder Aktualisierung liegt aber mindestens eine vom System definierte Pause (derzeit 30 Minuten). Darüber hinaus können Nutzer die Aktualisierungshäufigkeit selbst festlegen. Dazu haben sie die Möglichkeit, eine automatische Aktualisierung einzurichten oder eine manuelle Aktualisierung zu erzwingen. Die automatische Aktualisierung ist effizienter und weniger fehleranfällig, als manuell die entsprechende materialisierte Ansicht auf Anwendungsebene zu verwalten. Weitere Informationen zu Aktualisierungen finden Sie unter Materialisierte Ansichten verwalten.

Wie finde ich heraus, ob eine Abfrage durch die Abfrageoptimierung neu geschrieben wurde, um eine materialisierte Ansicht zu verwenden?

Prüfen Sie dafür den Abfrageplan. Wenn eine Abfrage von BigQuery neu geschrieben wurde, um eine materialisierte Ansicht zu nutzen, enthält der Abfrageplan den Schritt READ my_mv_table. Dabei ist my_mv_table der Name der materialisierten Ansicht, die durch die neu geschriebene Abfrage festgelegt wurde.

Wie verwalte ich materialisierte Ansichten über die Cloud Console?

Materialisierte Ansichten werden in der Cloud Console auf der Seite Dataset aufgeführt. Das folgende Beispiel zeigt, wie das Schema einer materialisierten Ansicht dargestellt wird:

Materialized View-Schema in der Google Cloud Console

Wie deaktiviere ich das Neuschreiben von Abfragen für eine bestimmte Abfrage?

Die BigQuery-Abfrageoptimierung schreibt Ihre Abfrage automatisch neu, um eine materialisierte Ansicht zu nutzen. Sie können dieses Neuschreiben von Abfragen aber deaktivieren, z. B. wenn Sie die Ergebnisse oder die Leistung einer Abfrage mit und ohne materialisierte Ansicht vergleichen möchten.

Um das Neuschreiben von Abfragen zu deaktivieren, fügen Sie Ihrer Abfrage der Basistabelle einen Filter "WHERE RAND()<1" hinzu. RAND() ist eine nicht deterministische Funktion. Daher wird die Abfrage nicht neu geschrieben. Da RAND()<1 immer "true" ergibt, wirkt sich dies nicht auf das Abfrageergebnis aus.

Löst eine Abfrage eine automatische Aktualisierung der materialisierten Ansicht aus?

Nein, eine Abfrage löst nicht automatisch eine Aktualisierung der materialisierten Ansicht aus.

Warum erhalte ich diese Fehlermeldungen?

Im Folgenden finden Sie Details zu häufigen Fehlern.

Fehler: "Abfrage in der materialisierten Ansicht enthält nicht unterstütztes Feature"

Dieser Fehler kann auftreten, wenn Sie eine materialisierte Ansicht erstellen. Mögliche Ursachen:

  • Die Abfrage enthält eine HAVING-Klausel:

    -- Results in an error
    SELECT date, COUNT(event) count FROM base_table GROUP BY date HAVING count >= 100
    
  • Die Abfrage enthält eine Berechnung zusätzlich zu einer Aggregationsfunktion:

    -- Results in an error
    SELECT date, ROUND(SUM(net_paid)) as sum_paid FROM base_table GROUP BY date
    

Materialisierte Ansichten dürfen nur Aggregationsfunktionen enthalten und nicht die HAVING-Klausel verwenden. Jegliche Nachfilterung und Nachberechnung müssen auf eine materialisierte Ansicht gesetzt werden. So erstellen Sie beispielsweise eine logische Ansicht:

CREATE MATERIALIZED VIEW my_dataset.my_mv AS
SELECT date, SUM(net_paid) sum_paid
FROM my_project.my_dataset.my_base_table
GROUP BY date

CREATE VIEW my_dataset.my_view AS
SELECT date, ROUND(sum_paid) sum_paid
FROM my_project.my_dataset.my_mv
WHERE sum_paid > 10.0

-- Now you can query the regular view
SELECT ... FROM my_dataset.my_view

Fehler: "Es ist ein interner Fehler aufgetreten und die Anfrage konnte nicht abgeschlossen werden."

Dieser Fehler kann auftreten, wenn Sie eine materialisierte Ansicht erstellen. Ein häufiger Grund für diesen Fehler ist eine Nachberechnung zusätzlich zu bestimmten Aggregationsfunktionen wie AVG, ARRAY_AGG und APPROX_COUNT_DISTINCT.

Beispiel für eine Anweisung, die den Fehler erzeugt:

-- Results in an error
CREATE MATERIALIZED VIEW my_dataset.my_mv AS
SELECT ROUND(AVG(x)) avg_x,
  ARRAY_AGG(x ORDER BY z LIMIT 1)[OFFSET(0)] top_x,
    APPROX_COUNT_DISTINCT(x) * 10 approx_cnt_x
FROM my_project.my_dataset.my_table

Verschieben Sie stattdessen [OFFSET(0)] in eine normale Ansicht über der materialisierten Ansicht:

CREATE MATERIALIZED VIEW my_dataset.my_mv AS
SELECT AVG(x) avg_x,
  ARRAY_AGG(x ORDER BY z LIMIT 1) top_x_arr,
  APPROX_COUNT_DISTINCT(x) approx_cnt_x
FROM my_project.my_dataset.my_table

CREATE VIEW my_dataset.my_view AS
SELECT ROUND(avg_x) as avg_x,
  top_x_arr[OFFSET(0)] as top_x,
  approx_cnt_x * 10 as approx_cnt_x
FROM my_project.my_dataset.my_mv

-- Now you can query the regular view
SELECT ... FROM my_dataset.my_view