SQL-Beispielabfragen

Dieses Dokument enthält Beispielabfragen von Logeinträgen, die in Log-Buckets gespeichert sind, die für die Verwendung von Loganalysen aktualisiert wurden. Für diese Buckets können Sie in der Google Cloud Console auf der Seite Loganalysen SQL-Abfragen ausführen. Weitere Beispiele finden Sie in den GitHub-Repositories logging-analytics-samples und security-analytics.

In diesem Dokument werden weder SQL noch das Weiterleiten und Speichern von Logeinträgen beschrieben. Informationen zu diesen Themen finden Sie im Abschnitt Weitere Informationen.

Hinweise

  • Wenn Sie die in diesem Dokument gezeigten Abfragen auf der Seite Loganalysen verwenden möchten, ersetzen Sie TABLE durch den Namen der Tabelle, die der abzufragenden Ansicht entspricht. Der Tabellenname hat das Format project_ID.region.bucket_ID.view_ID. Sie finden den Tabellennamen für eine Ansicht auf der Seite Loganalysen. Die Standardabfrage für eine Logansicht enthält den Tabellennamen in der FROM-Anweisung. Informationen zum Zugriff auf die Standardabfrage finden Sie unter Logansicht abfragen.

  • Wenn Sie die in diesem Dokument gezeigten Abfragen auf der Seite BigQuery Studio verwenden möchten, ersetzen Sie TABLE durch den Pfad zur Tabelle im verknüpften Dataset. Wenn Sie beispielsweise die Ansicht _AllLogs für das verknüpfte Dataset mydataset im Projekt myproject abfragen möchten, legen Sie dieses Feld auf myproject.mydataset._AllLogs fest:

    Öffnen Sie in der Google Cloud Console die Seite BigQuery:

    Zu BigQuery Studio

    Sie können diese Seite auch über die Suchleiste finden.

  • So öffnen Sie die Seite Loganalysen:

    1. Rufen Sie in der Google Cloud Console die Seite Loganalysen auf:

      Zu Loganalysen

      Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Monitoring ist.

    2. Optional: Um das Tabellenschema für die Logansicht zu ermitteln, suchen Sie in der Liste Logansichten nach der Ansicht und wählen Sie den Namen der Ansicht aus.

    Das Schema für die Tabelle wird angezeigt. Über das Feld Filter können Sie nach bestimmten Feldern suchen. Sie können das Schema nicht ändern.

Logs filtern

SQL-Abfragen bestimmen, welche Zeilen der Tabelle verarbeitet werden sollen, dann gruppieren sie die Zeilen und führen Aggregatvorgänge aus. Wenn kein Gruppierungs- und Aggregationsvorgang aufgeführt ist, enthält das Ergebnis der Abfrage die Zeilen, die vom Filtervorgang ausgewählt wurden. Die Beispiele in diesem Abschnitt veranschaulichen die Filterung.

Nach Uhrzeit filtern

Zum Festlegen des Zeitraums für die Abfrage empfehlen wir die Verwendung der Zeitraumauswahl. Diese Auswahl wird automatisch verwendet, wenn in einer Abfrage kein timestamp-Feld in der WHERE-Klausel angegeben ist. Wenn Sie beispielsweise die Daten der letzten Woche ansehen möchten, wählen Sie in der Zeitraumauswahl die Option Letzte 7 Tage aus. Mit der Zeitraumauswahl können Sie auch eine Start- und Endzeit angeben, eine Uhrzeit angeben, zu der Sie sich umsehen möchten, und die Zeitzone ändern.

Wenn Sie das Feld timestamp in die WHERE-Klausel aufnehmen, wird die Zeitraumauswahl nicht verwendet. Im folgenden Beispiel werden die Daten mit der Funktion TIMESTAMP_SUB gefiltert, mit der Sie ein Lookback-Intervall ab der aktuellen Zeit angeben können:

WHERE
  timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)

Weitere Informationen zum Filtern nach Zeit finden Sie unter Zeitfunktionen und Zeitstempelfunktionen.

Nach Ressource filtern

Fügen Sie die Einschränkung resource.type hinzu, um nach Ressource zu filtern.

Die folgende Abfrage liest beispielsweise die Daten der letzten Stunde, behält dann die Zeilen bei, deren Ressourcentyp gce_instance entspricht, und sortiert und zeigt dann bis zu 100 Einträge an:

SELECT
  timestamp, log_name, severity, json_payload, resource, labels
FROM
  `TABLE`
WHERE
  resource.type = "gce_instance"
ORDER BY timestamp ASC
LIMIT 100

Nach Schweregrad filtern

Sie können mit einer Einschränkung wie severity = 'ERROR' nach einem bestimmten Schweregrad filtern. Eine weitere Möglichkeit ist die Verwendung der IN-Anweisung und die Angabe einer Reihe gültiger Werte.

Die folgende Abfrage liest beispielsweise die Daten der letzten Stunde und behält dann nur die Zeilen bei, die ein severity-Feld mit dem Wert 'INFO' oder 'ERROR' enthalten:

SELECT
  timestamp, log_name, severity, json_payload, resource, labels
FROM
  `TABLE`
WHERE
  severity IS NOT NULL AND
  severity IN ('INFO', 'ERROR')
ORDER BY timestamp ASC
LIMIT 100

Bei der vorherigen Abfrage wird nach dem Wert des Felds severity gefiltert. Sie können jedoch auch Abfragen schreiben, die nach dem numerischen Wert des Logschweregrads filtern. Wenn Sie beispielsweise die Zeilen severity durch die folgenden Zeilen ersetzen, gibt die Abfrage alle Logeinträge zurück, deren Schweregrad mindestens NOTICE ist:

  severity_number IS NOT NULL AND
  severity_number > 200

Informationen zu den Aufzählungswerten finden Sie unter LogSeverity.

Nach Logname filtern

Zum Filtern nach einem Lognamen können Sie eine Einschränkung für den Wert des Felds log_name oder log_id hinzufügen. Das Feld log_name enthält den Ressourcenpfad. Das bedeutet, dass dieses Feld Werte wie projects/myproject/logs/mylog enthält. Im Feld log_id wird nur der Logname gespeichert, z. B. mylog.

Die folgende Abfrage liest beispielsweise die Daten der letzten Stunde, behält die Zeilen bei, in denen der Wert im Feld log_id cloudaudit.googleapis.com/data_access ist, und sortiert und zeigt dann die Ergebnisse an:

SELECT
  timestamp, log_id, severity, json_payload, resource, labels
FROM
  `TABLE`
WHERE
  log_id = "cloudaudit.googleapis.com/data_access"
ORDER BY timestamp ASC
LIMIT 100

Nach Ressourcenlabel filtern

Die meisten überwachten Ressourcendeskriptoren definieren Labels, die zum Identifizieren der jeweiligen Ressource verwendet werden. Der Deskriptor für eine Compute Engine-Instanz enthält beispielsweise Labels für die Zone, die Projekt-ID und die Instanz-ID. Beim Schreiben des Logeintrags werden jedem Feld Werte zugewiesen. Hier ein Beispiel:

{
   type: "gce_instance"
   labels: {
      instance_id: "1234512345123451"
      project_id: "my-project"
      zone: "us-central1-f"
   }
}

Da der Datentyp des Felds labels JSON ist, führt das Einbeziehen einer Einschränkung wie resource.labels.zone = "us-centra1-f" in einer Abfrage zu einem Syntaxfehler. Verwenden Sie die Funktion JSON_VALUE, um den Wert eines Felds mit dem Datentyp JSON abzurufen.

Mit der folgenden Abfrage werden beispielsweise die neuesten Daten gelesen und dann die Zeilen beibehalten, in denen die Ressource eine Compute Engine-Instanz in der Zone us-central1-f ist:

SELECT
  timestamp, log_name, severity, JSON_VALUE(resource.labels.zone) AS zone, json_payload, resource, labels
FROM
  `TABLE`
WHERE
  resource.type = "gce_instance" AND
  JSON_VALUE(resource.labels.zone) = "us-central1-f"
ORDER BY timestamp ASC
LIMIT 100

Informationen zu allen Funktionen, mit denen JSON-Daten abgerufen und transformiert werden können, finden Sie unter JSON-Funktionen.

Nach HTTP-Anfrage filtern

Fügen Sie eine http_request IS NOT NULL-Einschränkung hinzu, um die Tabelle so zu filtern, dass nur Zeilen enthalten sind, die einer HTTP-Anfrage oder -Antwort entsprechen:

SELECT
  timestamp, log_name, severity, http_request, resource, labels
FROM
  `TABLE`
WHERE
  http_request IS NOT NULL
ORDER BY timestamp
LIMIT 100

Die folgende Abfrage enthält nur Zeilen, die GET- oder POST-Anfragen entsprechen:

SELECT
  timestamp, log_name, severity, http_request, resource, labels
FROM
  `TABLE`
WHERE
  http_request IS NOT NULL AND
  http_request.request_method IN ('GET', 'POST')
ORDER BY timestamp ASC
LIMIT 100

Nach HTTP-Status filtern

Ändern Sie die WHERE-Klausel so, dass das Feld http_request.status definiert sein muss, um nach HTTP-Status zu filtern:

SELECT
  timestamp, log_name, http_request.status, http_request, resource, labels
FROM
  `TABLE`
WHERE
  http_request IS NOT NULL AND
  http_request.status IS NOT NULL
ORDER BY timestamp ASC
LIMIT 100

Um den Typ der in einem Feld gespeicherten Daten zu ermitteln, rufen Sie das Schema auf oder zeigen Sie das Feld an. Die Ergebnisse der vorherigen Abfrage zeigen, dass im Feld http_request.status Ganzzahlwerte gespeichert werden.

Nach einem Feld mit einem JSON-Typ filtern

Verwenden Sie die Funktion JSON_VALUE, um einen Wert aus einer Spalte mit dem Datentyp JSON zu extrahieren.

Betrachten Sie die folgenden Abfragen:

SELECT
  json_payload
FROM
  `TABLE`
WHERE
  json_payload.status IS NOT NULL

und

SELECT
  json_payload
FROM
  `TABLE`
WHERE
  JSON_VALUE(json_payload.status) IS NOT NULL

Bei den vorherigen Abfragen wird der Wert der Spalte json_payload getestet. Der Inhalt dieser Spalte wird durch den Inhalt eines Logeintrags bestimmt. In beiden Abfragen werden Zeilen verworfen, die die Spalte json_payload nicht enthalten. Die Differenz zwischen diesen beiden Abfragen ist die letzte Zeile, in der definiert wird, was mit NULL verglichen wird. Betrachten Sie nun eine Tabelle mit zwei Zeilen. In einer Zeile hat die Spalte json_payload das folgende Format:

{
    status: {
        measureTime: "1661517845"
    }
}

In der anderen Zeile hat die Spalte json_payload eine andere Struktur:

{
    @type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
    jobName: "projects/my-project/locations/us-central1/jobs/test1"
    relativeUrl: "/food=cake"
    status: "NOT_FOUND"
    targetType: "APP_ENGINE_HTTP"
}

Beide vorherigen Zeilen erfüllen die Einschränkung json_payload.status IS NOT NULL. Das heißt, das Ergebnis der Abfrage enthält beide Zeilen. Lautet die Einschränkung jedoch JSON_VALUE(json_payload.status) IS NOT NULL, wird nur die zweite Zeile in das Ergebnis aufgenommen.

Nach regulärem Ausdruck filtern

Verwenden Sie die Funktion REGEXP_EXTRACT, um den Teilstring zurückzugeben, der mit einem regulären Ausdruck übereinstimmt. Der Rückgabetyp dieser Funktion ist entweder STRING oder BYTES.

Die folgende Abfrage zeigt die zuletzt empfangenen Logeinträge an, behält sie mit dem Feld json_payload.jobName bei und zeigt dann den Teil des Namens an, der mit test beginnt:

SELECT
  timestamp, REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
FROM
  `TABLE`
WHERE
  json_payload.jobName IS NOT NULL
ORDER BY timestamp DESC
LIMIT 20

Weitere Beispiele finden Sie in der Dokumentation zu REGEXP_EXTRACT. Beispiele für reguläre Ausdrücke, die Sie verwenden können, finden Sie unter Funktionen, Operatoren und Bedingungen.

Die in diesem Beispiel gezeigte Abfrage ist nicht effizient. Verwenden Sie für eine Teilstring-Übereinstimmung, wie in der Abbildung dargestellt, die Funktion CONTAINS_SUBSTR.

Logeinträge gruppieren und zusammenfassen

Dieser Abschnitt baut auf den vorherigen Beispielen auf und veranschaulicht, wie Sie Tabellenzeilen gruppieren und aggregieren können. Wenn Sie keine Gruppierung, aber eine Aggregation angeben, wird ein einzelnes Ergebnis ausgegeben, da SQL alle Zeilen, die die WHERE-Klausel erfüllen, als einzelne Gruppe behandelt werden.

Jeder SELECT-Ausdruck muss in den Gruppenfeldern enthalten oder aggregiert sein.

Nach Zeit gruppieren

Zum Gruppieren von Daten nach Zeit verwenden Sie die Funktion TIMESTAMP_TRUNC, die einen Zeitstempel auf eine angegebene Granularität wie MINUTE kürzt. Der Zeitstempel 15:30:11 im Format hours:minutes:seconds wird beispielsweise zu 15:30:00, wenn der Detaillierungsgrad auf MINUTE festgelegt ist.

Die folgende Abfrage liest die Daten, die in dem in der Zeitraumauswahl angegebenen Intervall empfangen wurden, und behält dann die Zeilen bei, in denen der Wert des Felds json_payload.status nicht NULL ist. Die Abfrage kürzt den Zeitstempel in jeder Zeile um eine Stunde und gruppiert die Zeilen dann nach dem gekürzten Zeitstempel und Status:

SELECT
  TIMESTAMP_TRUNC(timestamp, HOUR) AS hour,
  JSON_VALUE(json_payload.status) AS status,
  COUNT(*) AS count
FROM
  `TABLE`
WHERE
  json_payload IS NOT NULL AND
  JSON_VALUE(json_payload.status) IS NOT NULL
GROUP BY hour,status
ORDER BY hour ASC

Weitere Beispiele finden Sie in der Dokumentation zu TIMESTAMP_TRUNC. Weitere Informationen zu anderen zeitbasierten Funktionen finden Sie unter Datum/Uhrzeit-Funktionen.

Nach Ressource gruppieren

Die folgende Abfrage liest die Daten der letzten Stunde und gruppiert die Zeilen dann nach dem Ressourcentyp. Anschließend wird die Anzahl der Zeilen für jeden Typ gezählt und eine Tabelle mit zwei Spalten zurückgegeben. Die erste Spalte enthält den Ressourcentyp, während die zweite Spalte die Anzahl der Zeilen für diesen Ressourcentyp enthält:

SELECT
   resource.type, COUNT(*) AS count
FROM
  `TABLE`
GROUP BY resource.type
LIMIT 100

Nach Schweregrad gruppieren

Die folgende Abfrage liest die Daten der letzten Stunde und behält dann Zeilen mit einem Schweregradfeld bei. Die Abfrage gruppiert dann die Zeilen nach Schweregrad und zählt die Anzahl der Zeilen für jede Gruppe:

SELECT
  severity, COUNT(*) AS count
FROM
  `TABLE`
WHERE
  severity IS NOT NULL
GROUP BY severity
ORDER BY severity
LIMIT 100

Nach log_id gruppieren

Das Ergebnis der folgenden Abfrage ist eine Tabelle mit zwei Spalten. In der ersten Spalte werden die Lognamen aufgeführt, in der zweiten die Anzahl der Logeinträge, die in das Log geschrieben wurden. Die Abfrage sortiert die Ergebnisse nach der Anzahl der Einträge:

SELECT
  log_id, COUNT(*) AS count
FROM
  `TABLE`
GROUP BY log_id
ORDER BY count DESC
LIMIT 100

Durchschnittliche Latenz für HTTP-Anfrage berechnen

Die folgende Abfrage veranschaulicht die Gruppierung nach mehreren Spalten und die Berechnung eines Durchschnittswerts. Die Abfrage gruppiert Zeilen nach der in der HTTP-Anfrage enthaltenen URL und nach dem Wert des Felds labels.checker_location. Nach dem Gruppieren der Zeilen berechnet die Abfrage die durchschnittliche Latenz für jede Gruppe:

SELECT
  JSON_VALUE(labels.checker_location) AS location,
  AVG(http_request.latency.seconds) AS secs, http_request.request_url
FROM
  `TABLE`
WHERE
  http_request IS NOT NULL AND
  http_request.request_method IN ('GET')
GROUP BY http_request.request_url, location
ORDER BY location
LIMIT 100

Im vorherigen Ausdruck ist JSON_VALUE erforderlich, um den Wert des Felds labels.checker_location zu extrahieren, da der Datentyp für labels JSON ist. Sie verwenden diese Funktion jedoch nicht, um den Wert aus dem Feld http_request.latency.seconds zu extrahieren. Das letzte Feld hat den Datentyp "Ganzzahl".

Durchschnittliche Byte berechnen, die für einen Subnetzwerktest gesendet wurden

Die folgende Abfrage zeigt, wie Sie die durchschnittliche Anzahl von Byte anzeigen können, die nach Standort gesendet wurden.

Die Abfrage liest die Daten der letzten Stunde und behält dann nur die Zeilen bei, deren Ressourcentypspalte gce_subnetwork und deren Spalte json_payload nicht NULL ist. Als Nächstes gruppiert die Abfrage die Zeilen nach dem Standort der Ressource. Im Gegensatz zum vorherigen Beispiel, in dem die Daten als numerischer Wert gespeichert werden, ist der Wert des Felds bytes_sent ein String. Daher müssen Sie den Wert vor der Berechnung des Durchschnitts in einen FLOAT64 umwandeln:

SELECT JSON_VALUE(resource.labels.location) AS location,
   AVG(CAST(JSON_VALUE(json_payload.bytes_sent) AS FLOAT64)) AS bytes
FROM
  `TABLE`
WHERE
  resource.type = "gce_subnetwork" AND
  json_payload IS NOT NULL
GROUP BY location
LIMIT 100

Das Ergebnis der vorherigen Abfrage ist eine Tabelle, in der in jeder Zeile ein Standort und die durchschnittlichen Byte aufgeführt sind, die für diesen Standort gesendet wurden.

Informationen zu allen Funktionen, mit denen JSON-Daten abgerufen und transformiert werden können, finden Sie unter JSON-Funktionen.

Informationen zu CAST und anderen Konvertierungsfunktionen finden Sie unter Conversion-Funktionen.

Logeinträge mit einem Feld zählen, das einem Muster entspricht

Verwenden Sie die Funktion REGEXP_EXTRACT, um den Teilstring zurückzugeben, der mit einem regulären Ausdruck übereinstimmt. Der Rückgabetyp dieser Funktion ist entweder STRING oder BYTES.

Durch die folgende Abfrage werden die Logeinträge beibehalten, deren Wert im Feld json_payload.jobName nicht NULL ist. Anschließend werden die Einträge nach dem Namenssuffix gruppiert, das mit test beginnt. Schließlich zählt die Abfrage die Anzahl der Einträge in jeder Gruppe:

SELECT
  REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
  COUNT(*) AS count
FROM
  `TABLE`
WHERE
  json_payload.jobName IS NOT NULL
GROUP BY name
ORDER BY count
LIMIT 20

Weitere Beispiele finden Sie in der Dokumentation zu REGEXP_EXTRACT. Beispiele für reguläre Ausdrücke, die Sie verwenden können, finden Sie unter Funktionen, Operatoren und Bedingungen.

In diesem Abschnitt werden zwei verschiedene Ansätze beschrieben, mit denen Sie in mehreren Spalten einer Tabelle suchen können.

Verwenden Sie die Funktion SEARCH, um in einer Tabelle nach Einträgen zu suchen, die mit einer Reihe von Suchbegriffen übereinstimmen. Für diese Funktion sind zwei Parameter erforderlich: wo gesucht werden soll und die Suchanfrage. Da die SEARCH-Funktion bestimmte Regeln dafür hat, wie die Daten durchsucht werden, empfehlen wir, die SEARCH-Dokumentation zu lesen.

Die folgende Abfrage behält nur die Zeilen bei, die ein Feld enthalten, das genau mit "35.193.12.15" übereinstimmt:

SELECT
  timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
  `TABLE` AS t
WHERE
  proto_payload IS NOT NULL AND
  log_id = "cloudaudit.googleapis.com/data_access" AND
  SEARCH(t,"`35.193.12.15`")
ORDER BY timestamp ASC
LIMIT 20

In der vorherigen Abfrage wird der Wert, nach dem gesucht werden soll, in Graviszeichen umschlossen. Dadurch wird sichergestellt, dass die Funktion SEARCH nach einer genauen Übereinstimmung zwischen einem Feldwert und dem Wert zwischen den Graviszeichen sucht.

Wenn Backticks im Abfragestring weggelassen werden, wird der Abfragestring anhand von Regeln aufgeteilt, die in der SEARCH-Dokumentation definiert sind. Wenn beispielsweise die folgende Anweisung ausgeführt wird, wird der Abfragestring in vier Tokens aufgeteilt: "35", "193", "12" und "15":

  SEARCH(t,"35.193.12.15")

Die vorherige SEARCH-Anweisung entspricht einer Zeile, wenn ein einzelnes Feld mit allen vier Tokens übereinstimmt. Die Reihenfolge der Tokens spielt keine Rolle.

Sie können mehrere SEARCH-Anweisungen in eine Abfrage aufnehmen. In der vorherigen Abfrage könnten Sie den Filter für die Log-ID beispielsweise durch eine Anweisung wie die folgende ersetzen:

  SEARCH(t,"`cloudaudit.googleapis.com/data_access`")

Mit der vorherigen Anweisung wird die gesamte Tabelle durchsucht, während die ursprüngliche Anweisung nur die Spalte log_id durchsucht.

Wenn Sie mehrere Suchen in einer Spalte ausführen möchten, trennen Sie die einzelnen Strings durch ein Leerzeichen. Die folgende Anweisung stimmt beispielsweise mit Zeilen überein, in denen ein Feld "Hello World", "happy" und "days" enthält:

  SEARCH(t,"`Hello World` happy days")

Schließlich können Sie auch in bestimmten Spalten einer Tabelle suchen, anstatt in der gesamten Tabelle zu suchen. Mit der folgenden Anweisung wird beispielsweise nur in den Spalten text_payload und json_payload gesucht:

   SEARCH((text_payload, json_payload) ,"`35.222.132.245`")

Informationen dazu, wie die Parameter der Funktion SEARCH verarbeitet werden, finden Sie auf der BigQuery-Referenzseite Suchfunktionen.

Verwenden Sie die Funktion CONTAINS_SUBSTR, um einen Test durchzuführen, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, um festzustellen, ob ein Wert in einem Ausdruck vorhanden ist. Diese Funktion gibt TRUE zurück, wenn der Wert vorhanden ist, andernfalls FALSE. Der Suchwert muss ein STRING-Literal sein, nicht aber das Literal NULL.

Die folgende Abfrage ruft beispielsweise alle Audit-Logeinträge zum Datenzugriff mit einer bestimmten IP-Adresse ab, deren Zeitstempel in einem bestimmten Zeitraum liegen. Schließlich sortiert die Abfrage die Ergebnisse und zeigt dann die 20 ältesten Ergebnisse an:

SELECT
  timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
  `TABLE` AS t
WHERE
  proto_payload IS NOT NULL AND
  log_id = "cloudaudit.googleapis.com/data_access" AND
  CONTAINS_SUBSTR(t,"35.193.12.15")
ORDER BY timestamp ASC
LIMIT 20

Mit der vorherigen Abfrage wird ein Teilstringtest durchgeführt. Daher entspricht eine Zeile, die „35.193.12.152“ enthält, der Anweisung CONTAINS_SUBSTR.

Daten aus mehreren Quellen kombinieren

Abfrageanweisungen scannen eine oder mehrere Tabellen oder Ausdrücke und geben die berechneten Ergebniszeilen zurück. Sie können beispielsweise Abfrageanweisungen verwenden, um die Ergebnisse von SELECT-Anweisungen für verschiedene Tabellen oder Datasets auf verschiedene Weise zusammenzuführen und dann die Spalten aus den kombinierten Daten auszuwählen.

Daten aus zwei Tabellen mit Joins kombinieren

Um Informationen aus zwei Tabellen zu kombinieren, verwenden Sie einen der join-Operatoren. Der Join-Typ und die verwendete bedingte Klausel bestimmen, wie Zeilen kombiniert und verworfen werden.

Die folgende Abfrage gibt die json_payload-Felder aus Zeilen in zwei verschiedenen Tabellen zurück, die vom selben Trace-Span geschrieben wurden. Die Abfrage führt eine innere JOIN über zwei Tabellen für Zeilen aus, in denen die Werte der Spalten span_id und trace in beiden Tabellen übereinstimmen. Die Abfrage wählt aus diesem Ergebnis die Felder timestamp, severity und json_payload aus TABLE_1, das Feld json_payload aus TABLE_2 und die Werte der Felder span_id und trace aus, mit denen die beiden Tabellen verknüpft wurden. Sie gibt bis zu 100 Zeilen zurück:

SELECT
  a.timestamp, a.severity, a.json_payload, b.json_payload, a.span_id, a.trace
FROM `TABLE_1` a
JOIN `TABLE_2` b
ON
  a.span_id = b.span_id AND
  a.trace = b.trace
LIMIT 100

Mehrfachauswahl mit Unions kombinieren

Mit dem Operator UNION können Sie die Ergebnisse von zwei oder mehr SELECT-Anweisungen kombinieren und doppelte Zeilen verwerfen. Um doppelte Zeilen beizubehalten, verwenden Sie den Operator UNION ALL.

Die folgende Abfrage liest die letzte Datenstunde aus TABLE_1, führt das Ergebnis mit der letzten Datenstunde aus TABLE_2 zusammen, sortiert die zusammengeführten Daten durch Erhöhen des Zeitstempels und zeigt dann die ältesten 100 Einträge an:

SELECT
  timestamp, log_name, severity, json_payload, resource, labels
FROM(
  SELECT * FROM `TABLE_1`
  UNION ALL
  SELECT * FROM `TABLE_2`
)
ORDER BY timestamp ASC
LIMIT 100

Nächste Schritte

Informationen zum Weiterleiten und Speichern von Logeinträgen finden Sie in den folgenden Dokumenten:

Die SQL-Referenzdokumentation finden Sie in den folgenden Dokumenten: