Daten effizient verwalten

Eine Kernfunktion vieler Google Ads-Anwendungen ist das Abrufen von Kontodaten für Anwendungsfälle wie Datenanalysen, Kundenanfragen und Prüfungen der Richtlinieneinhaltung. Optimieren Sie die Nutzung beim Abrufen der Daten, damit die Google-Server nicht überlastet werden und Sie nicht durch eine Ratenbegrenzung eingeschränkt werden. Weitere Informationen finden Sie in den Leitfäden zur Geschwindigkeitsbegrenzung und zur Pflege einer aktuellen Kontakt-E-Mail-Adresse.

Google-Richtlinie zur Ressourcennutzung für Berichte

Um die Stabilität der Server zu gewährleisten, werden mit der Google Ads API GoogleAdsService.Search- und GoogleAdsService.SearchStream-Abfragemuster gedrosselt, die übermäßig viele API-Ressourcen verbrauchen. Wenn ein bestimmtes Abfragemuster gedrosselt wird, funktionieren andere Dienste, Methoden und Abfragemuster weiterhin unbeeinflusst. Für gedrosselte Anfragen werden die folgenden Fehler ausgegeben:

API-Version Fehlercode
<= Version 17 QuotaError.RESOURCE_EXHAUSTED
>= Version 18 QuotaError.EXCESSIVE_SHORT_TERM_QUERY_RESOURCE_CONSUMPTION oder QuotaError.EXCESSIVE_LONG_TERM_QUERY_RESOURCE_CONSUMPTION, je nachdem, wie lange die hohe Ressourcennutzung andauert.

Damit Sie die kostenintensiven Berichte leichter identifizieren und im Blick behalten können, geben wir auch einen Kostenmesswert für einzelne Berichte zurück.

Methode Feld „Kosten“
GoogleAdsService.Search SearchGoogleAdsResponse.query_resource_consumption
GoogleAdsService.SearchStream SearchGoogleAdsStreamResponse.query_resource_consumption

Der Messwert „Kosten“, der von diesen Feldern zurückgegeben wird, hängt von verschiedenen Faktoren ab, z. B.

  • Die Größe Ihrer Konten
  • Die Datenansichten und -spalten, die Sie in Ihren Berichten abrufen
  • Die Auslastung der Google Ads API-Server.

Damit Sie ressourcenintensive Abfragen im Blick behalten können, veröffentlichen wir erste zusammengefasste Statistiken zur Ressourcennutzung verschiedener Abfragemuster, die wir auf unseren Servern sehen. Wir veröffentlichen regelmäßig aktualisierte Zahlen, damit Sie Ihre Suchanfragen optimieren können.

Zeitfenster Durchschnitt (p50). P70 (mittelhoch) P95 (sehr hoch)
Kurzfristig (5 Minuten) 6000 30000 1800000
Langfristig (24 Stunden). 16.000 90000 8400000

Angenommen, Sie führen ein Abfragemuster wie das folgende aus, das pro Bericht 600 Ressourceneinheiten verbraucht.

SELECT campaign.id, campaign.name, metrics.cost_micros FROM campaign WHERE
    segments.date = "YYYY-MM-DD"

Sie führen diese Abfrage für mehrere Kundenkonten für mehrere einzelne Datumsangaben aus, indem Sie die Abfrage so ändern, dass verschiedene Werte für den Filter segments.date ersetzt werden. In der folgenden Tabelle sehen Sie, wie viele Berichte Sie in einem bestimmten Zeitraum ausführen können, damit Ihre Ressourcennutzung in verschiedene Kategorien fällt.

Zeitfenster Durchschnitt Mittelhoch Sehr hoch
Kurzfristig (5 Minuten) 10 50 3000
Langfristig (24 Stunden). 26 150 14000

Wenn dieses Abfragemuster zehnmal in fünf Minuten ausgeführt wird, gilt das als durchschnittliche Nutzung. Wenn dagegen 3.000 Berichte in fünf Minuten ausgeführt werden, gilt das als sehr hohe Nutzung.

Es gibt mehrere Strategien, um den Ressourcenverbrauch Ihrer Berichte zu optimieren. Im restlichen Teil dieses Leitfadens werden einige dieser Strategien behandelt.

Daten im Cache speichern

Sie sollten die Entitätsdetails, die Sie von den API-Servern abrufen, in einer lokalen Datenbank zwischenspeichern, anstatt den Server jedes Mal aufzurufen, wenn Sie die Daten benötigen. Dies gilt insbesondere für Entitäten, auf die häufig zugegriffen wird oder die sich selten ändern. Verwenden Sie nach Möglichkeit change-event und change-status, um zu erkennen, welche Objekte sich seit der letzten Synchronisierung der Ergebnisse geändert haben.

Häufigkeit der Berichterstellung optimieren

In Google Ads finden Sie Richtlinien zur Aktualität und zur Häufigkeit der Aktualisierung von Daten. Anhand dieser Informationen können Sie festlegen, wie oft Berichte abgerufen werden sollen.

Wenn Sie Konten regelmäßig aktualisieren müssen, empfehlen wir, die Anzahl dieser Konten auf eine kleine Gruppe zu beschränken, z. B. nur auf die 20 wichtigsten Google Ads-Konten. Der Rest kann seltener aktualisiert werden, z. B. einmal oder zweimal täglich.

Größe von Berichten optimieren

Ihre Anwendung sollte große Datenmengen abrufen, anstatt eine große Anzahl kleiner Berichte auszuführen. Ein Faktor bei dieser Entscheidung sind die Kontolimits.

Im folgenden Codebeispiel werden beispielsweise die Statistiken für bestimmte Anzeigengruppen abgerufen und eine Datenbanktabelle mit Statistiken aktualisiert:

  List<long> adGroupIds = FetchAdGroupIdsFromLocalDatabase();

  foreach (long adGroupId in adGroupIds)
  {
    string query = "SELECT ad_group.id, ad_group.name, metrics.clicks, " +
        "metrics.cost_micros, metrics.impressions, segments.date FROM " +
        "ad_group WHERE segments.date DURING LAST_7_DAYS AND " +
        "ad_group.id = ${adGroupId}";
    List<GoogleAdsRow> rows = RunGoogleAdsReport(customerId, query);
    InsertRowsIntoStatsTable(adGroupId, rows);
  }

Dieser Code funktioniert gut in einem kleinen Testkonto. In Google Ads sind jedoch bis zu 20.000 Anzeigengruppen pro Kampagne und 10.000 Kampagnen pro Konto möglich. Wenn dieser Code also in einem großen Google Ads-Konto ausgeführt wird, kann das zu einer Überlastung der Google Ads API-Server führen, was zu einer Begrenzung der Rate und einer Drosselung führt.

Besser ist es, einen einzelnen Bericht zu erstellen und lokal zu verarbeiten. Ein solcher Ansatz mit einer In-Memory-Zuordnung ist dargestellt.

  Hashset<long> adGroupIds = FetchAdGroupIdsFromLocalDatabase();

  string query = "SELECT ad_group.id, ad_group.name, metrics.clicks, " +
      "metrics.cost_micros, metrics.impressions, segments.date FROM " +
      "ad_group WHERE segments.date DURING LAST_7_DAYS";
  List<GoogleAdsRow> rows = RunGoogleAdsReport(customer_id, query);

  var memoryMap = new Dictionary<long, List<GoogleAdsRow>>();
  for each (GoogleAdsRow row in rows)
  {
    var adGroupId = row.AdGroup.Id;

    if (adGroupIds.Contains(adGroupId))
    {
      CheckAndAddRowIntoMemoryMap(row, adGroupId, memoryMap);
    }
  }
  foreach (long adGroupId in memoryMap.Keys())
  {
    InsertRowsIntoStatsTable(adGroupId, rows);
  }

Dadurch wird die Auslastung der Google Ads API-Server reduziert, da weniger Berichte ausgeführt werden.

Wenn der Bericht zu groß ist, um im Arbeitsspeicher gespeichert zu werden, können Sie die Abfrage auch in kleinere Gruppen unterteilen, indem Sie eine LIMIT-Klausel hinzufügen, z. B.:

SELECT
  ad_group.id,
  ad_group.name,
  metrics.clicks,
  metrics.cost_micros,
  metrics.impressions,
  segments.date
FROM ad_group
WHERE segments.date DURING LAST_7_DAYS
  AND ad_group.id IN (id1, id2, ...)
LIMIT 100000

Labels sind eine weitere Möglichkeit, Entitäten zu gruppieren und die Anzahl der Berichtsabfragen zu reduzieren. Weitere Informationen finden Sie im Leitfaden zu Labels.

Abgerufene Daten optimieren

Achten Sie beim Erstellen von Berichten darauf, welche Spalten Sie in Ihre Abfragen aufnehmen. Im folgenden Beispiel wird die Ausführung alle Stunden geplant:

SELECT
  customer.id,
  customer.currency_code,
  campaign.id,
  campaign.name,
  ad_group.id,
  ad_group.name,
  ad_group_criterion.keyword.match_type,
  ad_group_criterion.keyword.text,
  ad_group_criterion.criterion_id,
  ad_group_criterion.quality_info.creative_quality_score,
  ad_group_criterion.system_serving_status,
  ad_group_criterion.negative,
  ad_group_criterion.quality_info.quality_score,
  ad_group_criterion.quality_info.search_predicted_ctr,
  ad_group_criterion.quality_info.post_click_quality_score,
  metrics.historical_landing_page_quality_score,
  metrics.search_click_share,
  metrics.historical_creative_quality_score,
  metrics.clicks,
  metrics.impressions
FROM keyword_view
WHERE segments.date DURING LAST_7_DAYS

Die einzigen Spalten, die sich wahrscheinlich stündlich ändern, sind metrics.clicks und metrics.impressions. Alle anderen Spalten werden selten oder gar nicht aktualisiert. Daher ist es sehr ineffizient, sie stündlich abzurufen. Sie können diese Werte in einer lokalen Datenbank speichern und einen Bericht vom Typ Änderungsereignis oder Änderungsstatus ausführen, um Änderungen einmal oder zweimal täglich herunterzuladen.

In einigen Fällen können Sie die Anzahl der heruntergeladenen Zeilen reduzieren, indem Sie entsprechende Filter anwenden.

Nicht verwendete Konten bereinigen

Wenn Ihre Anwendung Kundenkonten von Drittanbietern verwaltet, müssen Sie Ihre Anwendung mit Blick auf die Kundenabwanderung entwickeln. Sie sollten Ihre Prozesse und Datenspeicher regelmäßig bereinigen, um Konten von Kunden zu entfernen, die Ihre Anwendung nicht mehr verwenden. Beachten Sie beim Aufräumen inaktiven Google Ads-Konten die folgenden Hinweise:

  • Widerrufen Sie die Autorisierung, die Ihr Kunde Ihrer Anwendung zur Verwaltung seines Kontos erteilt hat.
  • Führen Sie keine API-Aufrufe mehr an die Google Ads-Konten des Kunden aus. Dies gilt insbesondere für Offlinejobs wie Cronjobs und Datenpipelines, die ohne Nutzereingriff ausgeführt werden sollen.
  • Wenn der Kunde seine Autorisierung widerrufen hat, sollte Ihre Anwendung die Situation reibungslos bewältigen und ungültige API-Aufrufe an die API-Server von Google vermeiden.
  • Wenn der Kunde sein Google Ads-Konto gekündigt hat, sollten Sie dies erkennen und ungültige API-Aufrufe an die API-Server von Google vermeiden.
  • Löschen Sie die Daten, die Sie aus den Google Ads-Konten des Kunden heruntergeladen haben, nach einer angemessenen Zeit aus Ihrer lokalen Datenbank.