FHIR-Ressourcenänderungen in BigQuery streamen

Auf dieser Seite wird erläutert, wie Sie einen FHIR-Speicher so konfigurieren, dass FHIR-Ressourcen automatisch nach BigQuery-Tabellen exportiert werden, sobald eine FHIR-Ressource erstellt, aktualisiert, gepatcht oder gelöscht wird. Dieser Vorgang wird als BigQuery-Streaming bezeichnet.

Mit BigQuery-Streaming können Sie Folgendes tun:

  • Synchronisieren Sie die Daten in einem FHIR-Speicher mit einem BigQuery-Dataset in Echtzeit.
  • Sie können komplexe Abfragen an FHIR-Daten durchführen, ohne sie jedes Mal nach BigQuery exportieren zu müssen, wenn Sie die Daten analysieren möchten.

Sie können BigQuery-Streaming für partitionierte Tabellen konfigurieren, um die Abfrageleistung zu verbessern und die Kosten zu senken. Eine Anleitung finden Sie unter FHIR-Ressourcen in partitionierte Tabellen streamen.

Hinweise

FHIR-Ressourcen nach BigQuery exportieren

Beschränkungen

Wenn Sie FHIR-Ressourcen aus Cloud Storage importieren, gilt Folgendes: werden die Änderungen nicht in BigQuery gestreamt.

BigQuery-Berechtigungen festlegen

Wenn Sie das BigQuery-Streaming aktivieren möchten, müssen Sie dem Dienstkonto Cloud Healthcare-Dienst-Agent zusätzliche Berechtigungen erteilen. Weitere Informationen finden Sie unter BigQuery-Berechtigungen für FHIR-Speicher.

BigQuery-Streaming in einem FHIR-Speicher konfigurieren

Konfigurieren Sie den StreamConfigs, um das BigQuery-Streaming zu aktivieren -Objekt in Ihrem FHIR-Speicher. In StreamConfigs können Sie resourceTypes[] konfigurieren Array, um zu steuern, welche Arten von FHIR-Ressourcen BigQuery-Streaming gilt. Wenn Sie resourceTypes[] nicht angeben, wird BigQuery Streaming gilt für alle FHIR-Ressourcentypen.

Hier finden Sie Erläuterungen zu anderen in StreamConfigs verfügbaren Konfigurationen, z. B. BigQueryDestination, Siehe FHIR-Ressourcen exportieren.

In den folgenden Beispielen wird gezeigt, wie Sie BigQuery-Streaming auf einen vorhandenen FHIR-Speicher.

Console

Zum Konfigurieren des BigQuery-Streamings auf einem vorhandenen FHIR-Speicher mithilfe der Methode Führen Sie in der Google Cloud Console die folgenden Schritte aus:

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

    Zu Datasets

  2. Wählen Sie das Dataset mit dem FHIR-Speicher aus, den Sie bearbeiten möchten.

  3. Klicken Sie in der Liste Datenspeicher auf den FHIR-Speicher, den Sie bearbeiten möchten.

  4. Führen Sie im Bereich BigQuery-Streaming die folgenden Schritte aus: Schritte:

    1. Klicken Sie auf Neue Streamingkonfiguration hinzufügen.
    2. Klicken Sie im Bereich Neue Streaming-Konfiguration auf Durchsuchen, um das BigQuery-Dataset auszuwählen, in das geänderte FHIR-Ressourcen gestreamt werden sollen.
    3. Wählen Sie im Drop-down-Menü Schematyp das Ausgabeschema für die BigQuery-Tabelle. Die folgenden Schemas sind verfügbar:
      • Analytics: Ein Schema, das auf dem Dokument SQL on FHIR basiert. Da BigQuery nur 10.000 Spalten pro Tabelle zulässt, werden keine Schemas für die Felder Parameters.parameter.resource, Bundle.entry.resource und Bundle.entry.response.outcome generiert.
      • Analytics V2 Ein Schema, das dem Analytics-Schema ähnelt, aber zusätzlich Folgendes unterstützt: Das Analytics V2-Schema belegt in der Zieltabelle mehr Speicherplatz als das Analytics-Schema.
    4. Wählen Sie im Schieberegler Rekursive Strukturtiefe eine Tiefe aus, um die Tiefe für alle rekursiven Strukturen im Ausgabeschema festzulegen. Standardmäßig ist der rekursive Wert 2.
    5. Wählen Sie in der Liste FHIR-Ressourcentypen auswählen die zu streamenden Ressourcentypen aus.
  5. Klicken Sie auf Fertig, um die Streamingkonfiguration zu speichern.

gcloud

Die gcloud CLI unterstützt diese Aktion nicht. Verwenden Sie stattdessen die Google Cloud Console, curl, PowerShell oder Ihre bevorzugte Sprache.

REST

Verwenden Sie zum Konfigurieren des BigQuery-Streamings in einem vorhandenen FHIR-Speicher die Methode projects.locations.datasets.fhirStores.patch .

In den folgenden Beispielen ist das Array resourceTypes[] nicht angegeben. Daher ist das BigQuery-Streaming für alle FHIR-Ressourcentypen aktiviert.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_ID ist die ID Ihres Google Cloud-Projekts
  • LOCATION ist der Standort des Datasets
  • DATASET_ID: das übergeordnete Dataset des FHIR-Speichers
  • FHIR_STORE_ID: die FHIR-Speicher-ID
  • BIGQUERY_DATASET_ID: der Name eines vorhandenen BigQuery-Datasets, in dem Sie FHIR-Ressourcenänderungen streamen
  • SCHEMA_TYPE: ein Wert für die Aufzählung SchemaType. Verwenden Sie einen der folgenden Werte:
    • ANALYTICS. Ein Schema, das auf dem Dokument SQL on FHIR basiert. Da in BigQuery nur 10.000 Spalten pro Tabelle zulässig sind, werden keine Schemas für die Felder Parameters.parameter.resource, Bundle.entry.resource und Bundle.entry.response.outcome generiert.
    • ANALYTICS_V2 Ein Schema, das ANALYTICS ähnelt, mit zusätzlicher Unterstützung für Folgendes:

      ANALYTICS_V2 verwendet in der Zieltabelle mehr Speicherplatz als ANALYTICS

      .
  • WRITE_DISPOSITION: ein Wert für die Aufzählung WriteDisposition. Verwenden Sie einen der folgenden Werte:
    • WRITE_EMPTY: Daten nur exportieren, wenn die Ziel-BigQuery-Tabellen leer sind.
    • WRITE_TRUNCATE. Alle vorhandenen Daten in den BigQuery-Tabellen löschen, bevor die FHIR-Ressourcen geschrieben werden.
    • WRITE_APPEND: Daten an die BigQuery-Zieltabellen anhängen.

JSON-Text anfordern:

{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json. Führen Sie folgenden Befehl im Terminal aus, um diese Datei im aktuellen Verzeichnis zu erstellen oder zu überschreiben:

cat > request.json << 'EOF'
{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}
EOF

Führen Sie dann folgenden Befehl aus, um Ihre REST-Anfrage zu senden:

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=streamConfigs"

PowerShell

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json. Führen Sie folgenden Befehl im Terminal aus, um diese Datei im aktuellen Verzeichnis zu erstellen oder zu überschreiben:

@'
{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}
'@  | Out-File -FilePath request.json -Encoding utf8

Führen Sie dann folgenden Befehl aus, um Ihre REST-Anfrage zu senden:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=streamConfigs" | Select-Object -Expand Content

APIs Explorer

Kopieren Sie den Anfragetext und öffnen Sie die Referenzseite für Methoden. Der API Explorer wird rechts auf der Seite geöffnet. Sie können mit diesem Tool interagieren, um Anfragen zu senden. Fügen Sie den Anfragetext in dieses Tool ein, füllen Sie alle Pflichtfelder aus und klicken Sie auf Ausführen.

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

Wenn Sie in der Ressource FhirStore Felder konfiguriert haben, werden diese auch in der Antwort angezeigt.

Wenn Sie FHIR-Ressourcenänderungen in BigQuery streamen, wird standardmäßig für jede gestreamte Ressource eine Ansicht erstellt. Die Ansicht hat folgende Attribute:

  • Sie hat denselben Namen wie die Ressource und die Tabelle der Ressource im BigQuery-Dataset. Wenn Sie beispielsweise eine Patientenressource streamen, wird eine Tabelle mit dem Namen Patient und eine Ansicht mit dem Namen Patientview erstellt.
  • Es enthält nur die aktuelle Version der Ressource und nicht alle bisherigen Versionen.

FHIR-Ressourcen in partitionierte Tabellen streamen

Zum Exportieren von FHIR-Ressourcen in nach BigQuery partitionierte Tabellen legen Sie TimePartitioning Aufzählung in der lastUpdatedPartitionConfig in Ihrem FHIR-Speicher ein.

Die partitionierten Tabellen funktionieren wie nach Zeiteinheit partitionierte Tabellen in BigQuery. Partitionierte Tabellen haben eine zusätzliche Spalte namens lastUpdated. Diese ist ein Duplikat der Spalte meta.lastUpdated, die aus dem Feld meta.lastUpdated in einer FHIR-Ressource generiert wird. BigQuery verwendet die lastUpdated , um Tabellen nach Stunde, Tag, Monat oder Jahr zu partitionieren.

Empfehlungen zur Auswahl der Partitionsgranularität finden Sie unter Tages-, Stunden-, Monats- oder Jahrespartitionierung wählen.

Vorhandene, nicht partitionierte BigQuery-Tabellen können nicht in partitionierte Tabellen umgewandelt werden. Wenn Sie Änderungen an Patientenressourcen in eine nicht partitionierte Patients-Tabelle exportieren und später einen neuen FHIR-Speicher mit Tabellenpartitionierung erstellen, der in dasselbe BigQuery-Dataset exportiert, exportiert die Cloud Healthcare API weiterhin Daten in die nicht partitionierte Patients-Tabelle. Wenn Sie eine partitionierte Tabelle nutzen möchten, Löschen Sie die vorhandene Tabelle Patients oder verwenden Sie ein anderes BigQuery-Dataset.

Wenn Sie einer vorhandenen FHIR-Geschäftskonfiguration eine Partitionierung hinzufügen, können Sie weiterhin in vorhandene nicht partitionierte Tabellen exportieren. Die Partitionierung wird jedoch nur wirksam, für neue Tabellen.

In den folgenden Beispielen wird gezeigt, wie Sie BigQuery-Streaming in einem vorhandenen FHIR-Speicher.

Console

Die Google Cloud Console und die gcloud CLI unterstützen diese Aktion nicht. Verwenden Sie stattdessen curl, PowerShell oder Ihre bevorzugte Sprache.

gcloud

Die Google Cloud Console und die gcloud CLI unterstützen diese Aktion nicht. Verwenden Sie stattdessen curl, PowerShell oder Ihre bevorzugte Sprache.

REST

So konfigurieren Sie das Streaming von BigQuery in partitionierte Tabellen auf einem vorhandenen FHIR-Speicher vorhanden sind, verwenden Sie projects.locations.datasets.fhirStores.patch .

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_ID ist die ID Ihres Google Cloud-Projekts
  • LOCATION ist der Standort des Datasets
  • DATASET_ID: das übergeordnete Dataset des FHIR-Speichers
  • FHIR_STORE_ID: die FHIR-Speicher-ID
  • BIGQUERY_DATASET_ID: der Name eines vorhandenen BigQuery-Datasets, in dem Sie FHIR-Ressourcenänderungen streamen
  • SCHEMA_TYPE: ein Wert für die Aufzählung SchemaType. Verwenden Sie einen der folgenden Werte:
    • ANALYTICS Ein Schema, das auf dem Dokument SQL on FHIR basiert. Da BigQuery nur 10.000 Spalten pro Tabelle zulässt, werden keine Schemas für die Felder Parameters.parameter.resource, Bundle.entry.resource und Bundle.entry.response.outcome generiert.
    • ANALYTICS_V2 Ein Schema, das ANALYTICS ähnelt, mit zusätzlicher Unterstützung für Folgendes:

      ANALYTICS_V2 belegt mehr Platz in der Zieltabelle als ANALYTICS

      .
  • TIME_PARTITION_TYPE: die Detailebene, auf der exportierte FHIR-Ressourcen partitioniert werden sollen. Verwenden Sie einen der folgenden Werte:
    • HOUR: Daten nach Stunde partitionieren
    • DAY: Daten nach Tag partitionieren
    • MONTH: Daten nach Monat partitionieren
    • YEAR: Daten nach Jahr partitionieren
  • WRITE_DISPOSITION: ein Wert für die Aufzählung WriteDisposition. Verwenden Sie einen der folgenden Werte:
    • WRITE_EMPTY: Daten nur exportieren, wenn die Ziel-BigQuery-Tabellen leer sind.
    • WRITE_TRUNCATE. Alle vorhandenen Daten in den BigQuery-Tabellen löschen, bevor die FHIR-Ressourcen geschrieben werden.
    • WRITE_APPEND: Daten an die BigQuery-Zieltabellen anhängen.

JSON-Text anfordern:

{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
          "lastUpdatedPartitionConfig": {
            "type": "TIME_PARTITION_TYPE"
          }
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json. Führen Sie folgenden Befehl im Terminal aus, um diese Datei im aktuellen Verzeichnis zu erstellen oder zu überschreiben:

cat > request.json << 'EOF'
{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
          "lastUpdatedPartitionConfig": {
            "type": "TIME_PARTITION_TYPE"
          }
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}
EOF

Führen Sie dann folgenden Befehl aus, um Ihre REST-Anfrage zu senden:

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=streamConfigs"

PowerShell

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json. Führen Sie folgenden Befehl im Terminal aus, um diese Datei im aktuellen Verzeichnis zu erstellen oder zu überschreiben:

@'
{
  "streamConfigs": [
    {
      "bigqueryDestination": {
        "datasetUri": "bq://PROJECT_ID.BIGQUERY_DATASET_ID",
        "schemaConfig": {
          "schemaType": "SCHEMA_TYPE",
          "lastUpdatedPartitionConfig": {
            "type": "TIME_PARTITION_TYPE"
          }
        },
        "writeDisposition": "WRITE_DISPOSITION"
      }
    }
  ]
}
'@  | Out-File -FilePath request.json -Encoding utf8

Führen Sie dann folgenden Befehl aus, um Ihre REST-Anfrage zu senden:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=streamConfigs" | Select-Object -Expand Content

APIs Explorer

Kopieren Sie den Anfragetext und öffnen Sie die Referenzseite für Methoden. Der API Explorer wird rechts auf der Seite geöffnet. Sie können mit diesem Tool interagieren, um Anfragen zu senden. Fügen Sie den Anfragetext in dieses Tool ein, füllen Sie alle Pflichtfelder aus und klicken Sie auf Ausführen.

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

Partitionierte Tabelle abfragen

Um die Abfragekosten beim Abfragen von partitionierten Tabellen zu reduzieren, verwenden Sie die Methode WHERE um nach Zeiteinheiten zu filtern.

Angenommen, Sie legen den Parameter PartitionType enum in DAY auf. Wenn Sie eine Patients-Tabelle nach Patientenressourcen abfragen möchten, die sich an einem bestimmten Datum geändert haben, führen Sie die folgende Abfrage aus:

SELECT * FROM `PROJECT_ID.BIGQUERY_DATASET.Patients`
  WHERE DATE(lastUpdated) = 'YYYY-MM-DD'

Von Analytics zu Analytics V2 migrieren

Sie können ein vorhandenes BigQuery-Dataset nicht mit einer der folgenden Methoden vom Analytics-Schema in das Analytics V2-Schema migrieren:

Das liegt daran, dass die BigQuery-Tabellenspalten FHIR-Erweiterungen im Analytics-Schema ist der Modus auf NULLABLE festgelegt, während für die im Schema im Analytics V2-Schema auf REPEATED gesetzt sind. In BigQuery kann der Modus einer Spalte nicht von NULLABLE zu REPEATED geändert werden. Daher sind die beiden Schematypen nicht kompatibel.

Wenn Sie den Schematyp der exportierten FHIR-Ressourcen von Analytics nach Analytics V2 migrieren möchten, müssen Sie die FHIR-Ressourcen mit einer neuen Streamingkonfiguration mit dem aktualisierten Schematyp in ein neues BigQuery-Dataset exportieren. Aufgabe Gehen Sie daher folgendermaßen vor:

  1. Erstellen Sie ein neues BigQuery-Dataset.

  2. Berechtigungen für das BigQuery-Dataset festlegen

  3. Fügen Sie dem FHIR-Speicher eine neue Streamingkonfiguration hinzu, bei der der Schematyp auf Analytics V2 festgelegt ist.

  4. Füllen Sie vorhandene Daten auf, indem Sie die vorhandenen FHIR-Daten mit den folgenden Einstellungen exportieren. Siehe FHIR-Ressourcen exportieren finden Sie eine Anleitung zum Konfigurieren dieser Einstellungen mit der Google Cloud Console, der Google Cloud CLI oder der REST API. Die folgenden Einstellungen gelten für die REST API:

Die Ansichten in BigQuery, die einigen oder allen FHIR-Ressourcen entsprechen im ursprünglichen BigQuery-Dataset in Ihrem neuen Dataset. Informationen zur Fehlerbehebung finden Sie unter Fehlende Erstellung der FHIR-Ressourcendatenansicht.

Fehlerbehebung beim FHIR-Streaming

Wenn Fehler beim Senden von Ressourcenänderungen an BigQuery auftreten, werden diese in Cloud Logging protokolliert. Weitere Informationen finden Sie unter Fehlerlogs in Cloud Logging ansehen.

Spalte kann nicht von NULLABLE in REPEATED konvertiert werden

Dieser Fehler wird durch eine wiederholte Erweiterung verursacht. Um diesen Fehler zu beheben, ANALYTICS_V2 verwenden Schematyp. Wenn Sie ANALYTICS_V2 bereits verwenden, gibt es möglicherweise eine Konflikt zwischen zwei Erweiterungen oder Konflikt zwischen einer und einer anderen Erweiterung ein.

Spaltennamen werden aus dem Text nach dem letzten /-Zeichen in Erweiterungs-URLs generiert. Wenn eine Erweiterungs-URL mit einem Wert wie /resource_field name endet, kann es zu Konflikten kommen.

Um zu verhindern, dass dieser Fehler noch einmal auftritt, verwenden Sie keine Erweiterungen, deren Feldnamen mit den zu befüllenden Ressourcenfeldern übereinstimmen.

Erstellung der FHIR-Ressourcenansicht fehlt

Wenn Sie einen Bulk-Export von einer FHIR-Ressource an BigQuery ausführen, bevor diese FHIR-Ressource gestreamt wird, erstellt BigQuery keine Ansichten für die FHIR-Ressource.

In der folgenden Situation werden beispielsweise keine Ansichten für Ressourcen vom Typ „Encounter” angezeigt:

  1. Sie konfigurieren das BigQuery-Streaming in einem FHIR-Speicher und verwenden dann die REST API, um eine Patientenressource zu erstellen.

    In BigQuery werden eine Tabelle und eine Ansicht für die Patientenressource erstellt.

  2. Sie führen einen Bulk-Export aus Encounter-Ressourcen in dasselbe BigQuery-Dataset wie im vorherigen Schritt aus.

    BigQuery erstellt eine Tabelle für die Ressourcen des Typs „Encounter”.

  3. Sie verwenden die REST API, um eine Ressource vom Typ „Encounter” zu erstellen.

    Nach diesem Schritt werden BigQuery-Ansichten nicht mehr für die Encounter-Ressource erstellt.

Verwenden Sie folgende Abfrage zum Erstellen einer Ansicht, um dieses Problem zu beheben:

SELECT
    * EXCEPT (_resource_row_id)
FROM (
  SELECT
    ROW_NUMBER() OVER(PARTITION BY id ORDER BY meta.lastUpdated DESC) as _resource_row_id,
    *
    FROM `PROJECT_ID.BIGQUERY_DATASET_ID.RESOURCE_TABLE` AS p
) AS p
WHERE
  p._resource_row_id=1
  AND
  NOT EXISTS (
  SELECT
    *
  FROM
    UNNEST(p.meta.tag)
  WHERE
    code = 'DELETE');

Dabei gilt:

  • PROJECT_ID ist die ID Ihres Google Cloud-Projekts
  • BIGQUERY_DATASET_ID ist die ID des BigQuery-Datasets, in das Sie eine FHIR-Ressource per Bulk exportiert haben
  • RESOURCE_TABLE ist der Name der Tabelle, die der FHIR-Ressource entspricht, für die Sie Ansichten erstellen möchten

Nachdem Sie die Ansicht erstellt haben, können Sie weiter Änderungen an die FHIR-Ressource streamen. Die Ansicht wird entsprechend aktualisiert.

Nächste Schritte

Eine Anleitung zu einem Anwendungsfall für das Streaming von FHIR-Ressourcenänderungen finden Sie unter FHIR-Ressourcen mit BigQuery streamen und synchronisieren