Föderierte AlloyDB-Abfragen

Als Datenanalyst können Sie Daten in AlloyDB for PostgreSQL mithilfe von föderierten Abfragen aus BigQuery abfragen.

Mit der BigQuery-AlloyDB-Föderation kann BigQuery Daten in AlloyDB in Echtzeit abfragen, ohne die Daten kopieren oder verschieben zu müssen.

Hinweise

Daten abfragen

Verwenden Sie die Funktion EXTERNAL_QUERY, um eine föderierte Abfrage aus einer GoogleSQL-Abfrage an Spanner zu senden.

Angenommen Sie speichern eine Kundentabelle in BigQuery und eine Verkaufstabelle in AlloyDB und möchten die beiden Tabellen in einer einzigen Abfrage verknüpfen. Im folgenden Beispiel wird eine föderierte Abfrage an eine AlloyDB-Tabelle namens orders gesendet und die Ergebnisse werden mit einer BigQuery-Tabelle namens mydataset.customers verknüpft.

Die Beispielabfrage besteht aus 3 Teilen:

  1. Die externe Abfrage SELECT customer_id, MIN(order_date) AS first_order_date FROM orders GROUP BY customer_id wird in der AlloyDB-Datenbank ausgeführt, um das erste Bestelldatum für jeden Kunden über die Funktion EXTERNAL_QUERY abzurufen.

  2. Verknüpfen Sie die Ergebnistabelle der externen Abfrage mit der Kundentabelle in BigQuery anhand von customer_id.

  3. Wählen Sie in der endgültigen Ergebnismenge die Kundendaten und das Datum der ersten Bestellung aus.

SELECT c.customer_id, c.name, rq.first_order_date
FROM mydataset.customers AS c
LEFT OUTER JOIN EXTERNAL_QUERY(
  'us.connection_id',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''') AS rq ON rq.customer_id = c.customer_id
GROUP BY c.customer_id, c.name, rq.first_order_date;

AlloyDB-Tabellenschema ansehen

Mit der Funktion EXTERNAL_QUERY können Sie information_schema-Tabellen abfragen, um auf Datenbankmetadaten zuzugreifen. Sie können beispielsweise alle Tabellen in der Datenbank auflisten oder das Tabellenschema aufrufen. Weitere Informationen finden Sie unter information_schema-Tabellen in PostgreSQL.

-- List all tables in a database.
SELECT * FROM EXTERNAL_QUERY("region.connection_id",
"select * from information_schema.tables;");
-- List all columns in a table.
SELECT * FROM EXTERNAL_QUERY("region.connection_id",
"select * from information_schema.columns where table_name='x';");

Föderierte BigQuery-Abfragen verfolgen

Wenn Sie eine föderierte Abfrage für AlloyDB ausführen, annotiert BigQuery die Abfrage mit einem Kommentar ähnlich dem folgenden:

/* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID. */

Wenn Sie Logs für die Abfragenutzung überwachen, können Sie mit der folgenden Annotation Abfragen identifizieren, die von BigQuery stammen.

  1. Rufen Sie die Seite Log-Explorer auf.

    Zu „Log-Explorer“

  2. Geben Sie im Tab Abfrage die folgende Abfrage ein:

    resource.type="alloydb.googleapis.com/Instance"
    textPayload=~"Federated query from BigQuery"
    
  3. Klicken Sie auf Abfrage ausführen.

    Wenn Einträge für föderierte BigQuery-Abfragen verfügbar sind, wird unter Abfrageergebnisse eine Liste von Einträgen ähnlich der folgenden angezeigt.

    YYYY-MM-DD hh:mm:ss.millis UTC [3210064]: [4-1]
    db=DATABASE, user=USER_ACCOUNT
    STATEMENT: SELECT 1 FROM (SELECT FROM company_name_table) t;
    /* Federated query from BigQuery.
    Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID
    */
    
    YYYY-MM-DD hh:mm:ss.millis UTC [3210532]: [2-1]
    db=DATABASE, user=USER_ACCOUNT
    STATEMENT: SELECT "company_id", "company type_id" FROM
    (SELECT FROM company_name_table) t;
    /* Federated query from BigQuery.
    Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID
    */
    

    Weitere Informationen zu Cloud Logging finden Sie unter Cloud Logging.

Fehlerbehebung

In diesem Abschnitt werden potenzielle Fehler beschrieben, die beim Senden einer föderierten Abfrage an AlloyDB auftreten können. Außerdem werden mögliche Lösungen zur Fehlerbehebung angegeben.

Problem: Verbindung zum Datenbankserver mit folgendem Fehler konnte nicht hergestellt werden: Invalid table-valued function EXTERNAL_QUERY Connect to PostgreSQL server failed: server closed the connection unexpectedly. This probably means the server terminated abnormally before or while processing the request.

Lösung: Achten Sie darauf, dass Sie beim Erstellen der Verbindung zu AlloyDB gültige Anmeldedaten verwendet und alle Voraussetzungen erfüllt haben. Prüfen Sie, ob das automatisch erstellte Dienstkonto beim Erstellen einer Verbindung zu AlloyDB die Rolle „AlloyDB-Client“ (roles/alloydb.client) hat. Weitere Informationen finden Sie unter Zugriff auf das Dienstkonto gewähren.

Nächste Schritte