SQL-Beispielabfragen

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

In diesem Dokument wird 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 Ansicht entspricht, die Sie abfragen möchten. Der Tabellenname hat das Format project_ID.region.bucket_ID.view_ID. Sie finden den Tabellennamen für eine Ansicht auf der Seite Loganalysen. Bei der Standardabfrage für eine Logansicht wird der Tabellenname in der FROM-Anweisung aufgeführt. Informationen zum Zugreifen 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:

    Wählen Sie im Navigationsbereich der Google Cloud Console BigQuery aus:

    Zu BigQuery

  • So öffnen Sie die Seite Loganalysen:

    1. Wählen Sie im Navigationsbereich der Google Cloud Console Logging und dann Loganalysen aus:

      Gehen Sie zu Log Analytics.

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

    Das Schema für die Tabelle wird angezeigt. Mit dem 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 keine Gruppierungs- und Aggregationsvorgänge aufgeführt sind, enthält das Ergebnis der Abfrage die Zeilen, die vom Filtervorgang ausgewählt wurden. Die Beispiele in diesem Abschnitt veranschaulichen das Filtern.

Nach Uhrzeit filtern

Um den Zeitraum der Abfrage festzulegen, empfehlen wir die Verwendung der Zeitraumauswahl. Dieser Selektor wird automatisch verwendet, wenn bei einer Abfrage kein timestamp-Feld in der WHERE-Klausel angegeben ist. Wenn Sie beispielsweise die Daten für die vergangene Woche anzeigen möchten, wählen Sie in der Zeitraumauswahl die Option Letzte 7 Tage aus. Über die Zeitraumauswahl können Sie auch eine Start- und Endzeit sowie eine Uhrzeit für die Ansicht festlegen und die Zeitzone ändern.

Wenn Sie ein timestamp-Feld in die WHERE-Klausel aufnehmen, wird die Einstellung für die Zeitraumauswahl nicht verwendet. Im folgenden Beispiel werden die Daten mithilfe der Funktion TIMESTAMP_SUB gefiltert, mit der Sie ein Lookback-Intervall für die aktuelle 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 eine resource.type-Einschränkung hinzu, um nach Ressource zu filtern.

Die folgende Abfrage liest beispielsweise die Daten der letzten Stunde. Dann werden die Zeilen beibehalten, deren Ressourcentyp mit gce_instance übereinstimmt. Anschließend werden bis zu 100 Einträge sortiert und angezeigt:

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

Mit einer Einschränkung wie severity = 'ERROR' können Sie nach einem bestimmten Schweregrad filtern. Eine weitere Möglichkeit besteht darin, die Anweisung IN zu verwenden und eine Reihe gültiger Werte anzugeben.

Die folgende Abfrage liest beispielsweise die letzte Stunde an Daten und behält 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

Die vorherige Abfrage filtert nach dem Wert des Felds severity. 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 mit dem Schweregrad NOTICE zurück:

  severity_number IS NOT NULL AND
  severity_number > 200

Informationen zu den Aufzählungswerten finden Sie unter LogSeverity.

Nach Logname filtern

Wenn Sie nach einem Lognamen filtern möchten, können Sie eine Einschränkung für den Wert des Felds log_name oder log_id festlegen. Das Feld log_name enthält den Ressourcenpfad. Das Feld enthält also Werte wie projects/myproject/logs/mylog. Im Feld log_id wird nur der Logname gespeichert, z. B. mylog.

Die folgende Abfrage liest beispielsweise die letzte Stunde an Daten. Dann werden die Zeilen beibehalten, in denen der Wert im Feld log_id cloudaudit.googleapis.com/data_access ist. Anschließend werden die Ergebnisse sortiert und angezeigt:

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, mit denen die jeweilige Ressource identifiziert wird. Beispielsweise enthält der Deskriptor für eine Compute Engine-Instanz Labels für die Zone, die Projekt-ID und die Instanz-ID. Wenn der Logeintrag geschrieben wird, 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 eine Einschränkung wie resource.labels.zone = "us-centra1-f" in einer Abfrageergebnisse zu einem Syntaxfehler. Verwenden Sie die Funktion JSON_VALUE, um den Wert eines Felds mit dem Datentyp JSON abzurufen.

Die folgende Abfrage liest beispielsweise die neuesten Daten und behält dann die Zeilen bei, bei 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 zum Abrufen und Transformieren von JSON-Daten finden Sie unter JSON-Funktionen.

Nach HTTP-Anfrage filtern

Wenn Sie die Tabelle so filtern möchten, dass nur Zeilen enthalten sind, die einer HTTP-Anfrage oder -Antwort entsprechen, fügen Sie eine http_request IS NOT NULL-Einschränkung hinzu:

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

Wenn Sie nach HTTP-Status filtern möchten, ändern Sie die WHERE-Klausel so, dass das Feld http_request.status definiert werden muss:

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 bestimmen, 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 keine Spalte mit der Bezeichnung json_payload enthalten. Der Unterschied zwischen diesen beiden Abfragen ist die letzte Zeile, die definiert, was gegen NULL getestet wird. Betrachten wir 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 einem regulären Ausdruck entspricht. Der Rückgabetyp dieser Funktion ist entweder STRING oder BYTES.

Die folgende Abfrage zeigt die zuletzt empfangenen Logeinträge an, behält diese im 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 andere 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 aggregieren

Dieser Abschnitt baut auf den vorherigen Beispielen auf und zeigt, 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 eine Gruppe behandelt.

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

Nach Zeit gruppieren

Um Daten nach Zeit zu gruppieren, verwenden Sie die Funktion TIMESTAMP_TRUNC, die einen Zeitstempel auf einen bestimmten Detaillierungsgrad wie MINUTE kürzt. Ein Zeitstempel von 15:30:11, der als hours:minutes:seconds formatiert ist, wird beispielsweise zu 15:30:00, wenn der Detaillierungsgrad auf MINUTE festgelegt ist.

Die folgende Abfrage liest die Daten, die in dem von der Zeitraumauswahl angegebenen Intervall empfangen wurden, und behält dann die Zeilen bei, bei denen der Wert des Felds json_payload.status nicht NULL ist. Die Abfrage kürzt den Zeitstempel jeder Zeile nach Stunde und gruppiert die Zeilen dann nach dem abgeschnittenen 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. Informationen zu anderen zeitbasierten Funktionen finden Sie unter Datum/Uhrzeit-Funktionen.

Nach Ressource gruppieren

Die folgende Abfrage liest die letzte Stunde an Daten und gruppiert die Zeilen dann nach Ressourcentyp. Dann 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 und die zweite Spalte die Anzahl der Zeilen für diesen Ressourcentyp:

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

Nach Schweregrad gruppieren

Die folgende Abfrage liest die letzte Stunde an Daten und behält Zeilen mit einem Feld für den Schweregrad 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. Die erste Spalte enthält die Lognamen und die zweite die Anzahl der Logeinträge, die in der letzten Stunde in dieses 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 Feldes 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, die für einen Subnetzwerktest gesendet wurden, berechnen

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, bei dem die Daten als numerischer Wert gespeichert sind, ist der Wert des Feldes 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 jede Zeile einen Standort und die durchschnittlich für diesen Standort gesendeten Byte auflistet.

Informationen zu allen Funktionen zum Abrufen und Transformieren von JSON-Daten finden Sie unter JSON-Funktionen.

Informationen zu CAST und anderen Konvertierungsfunktionen finden Sie unter Konvertierungsfunktionen.

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

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

Die folgende Abfrage behält die Logeinträge bei, bei denen der Wert des Felds 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 andere 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 mehrere Spalten einer Tabelle durchsuchen können.

Mit der Funktion SEARCH können Sie in einer Tabelle nach Einträgen suchen, die mit einer Reihe von Suchbegriffen übereinstimmen. Für diese Funktion sind zwei Parameter erforderlich: Wo gesucht werden soll und die Suchanfrage. Da für die SEARCH-Funktion bestimmte Regeln dafür gelten, wie die Daten durchsucht werden, empfehlen wir, die SEARCH-Dokumentation zu lesen.

Die folgende Abfrage behält nur die Zeilen bei, deren Feld 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 zu suchende Wert durch Backticks (Gravis) umschlossen. Dadurch wird sichergestellt, dass die SEARCH-Funktion nach einer genauen Übereinstimmung zwischen einem Feldwert und dem Wert zwischen den Graviszeichen sucht.

Wenn Backticks im Abfragestring weggelassen werden, wird der Abfragestring basierend auf den in der SEARCH-Dokumentation definierten Regeln aufgeteilt. 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, mit der ursprünglichen Anweisung dagegen nur in der Spalte log_id.

Wenn Sie mehrere Suchvorgänge in einer Spalte durchführen möchten, trennen Sie die einzelnen Strings durch ein Leerzeichen. Die folgende Anweisung entspricht beispielsweise Zeilen, bei denen ein Feld "Hello World", "healthy" und "days" enthält:

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

Und schließlich können Sie auch nur in bestimmten Spalten einer Tabelle suchen, anstatt in der gesamten Tabelle. Mit der folgenden Anweisung werden beispielsweise nur die Spalten text_payload und json_payload gesucht:

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

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

Verwenden Sie die Funktion CONTAINS_SUBSTR, um einen Test durchzuführen, bei dem die Groß-/Kleinschreibung nicht berücksichtigt wird. So lässt sich feststellen, 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. Zuletzt 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. Beispielsweise können Sie Abfrageanweisungen verwenden, um die Ergebnisse von SELECT-Anweisungen auf verschiedene Weise in verschiedenen Tabellen oder Datasets zusammenzuführen und dann die Spalten aus den kombinierten Daten auszuwählen.

Daten aus zwei Tabellen mit Joins kombinieren

Wenn Sie Informationen aus zwei Tabellen kombinieren möchten, verwenden Sie einen der join-Operatoren. Der Join-Typ und die verwendete Bedingungsklausel bestimmen, wie Zeilen kombiniert und verworfen werden.

Wenn Sie einen Join-Operator in einer Abfrage auf der Seite Loganalysen verwenden, müssen sich die zu verknüpfenden Tabellen im selben Google Cloud-Projekt befinden.

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

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. Verwenden Sie den Operator UNION ALL, um doppelte Zeilen beizubehalten.

Wenn Sie einen Union-Operator in einer Abfrage auf der Seite Loganalysen verwenden und aus mehreren Tabellen auswählen, müssen sich die Tabellen im selben Google Cloud-Projekt befinden.

Die folgende Abfrage liest die letzte Stunde an Daten aus TABLE_1, führt das Ergebnis mit der letzten Stunde an Daten aus TABLE_2 zusammen, sortiert die zusammengeführten Daten durch Erhöhung 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:

Eine SQL-Referenzdokumentation finden Sie in den folgenden Dokumenten: