2016-08-08 30 views
2

Ich versuche, eine ziemlich einfache Abfrage auszuführen, aber es ist mit einem Resources exceeded Fehler fehlgeschlagen.
Ich lese in another post, dass die Heuristik, die verwendet wird, um die Anzahl der Mischer zuzuweisen, von Zeit zu Zeit fehlschlagen könnte.ARRAY_AGG führt zu OOM

SELECT 
    response.auctionId, 
    response.scenarioId, 
    ARRAY_AGG(response) AS responses 
FROM 
    rtb_response_logs.2016080515 
GROUP BY 
    response.auctionId, 
    response.scenarioId 

Gibt es eine Möglichkeit, meine Abfrage zu beheben wissen, dass:

  • ein response besteht aus 38 Feldern (die meisten von ihnen sind kurze Strings)
  • die max(count()) eines einzelnen response Art ist niedriger (165)

Abfrage fehlgeschlagen
01.235.Fehler: Ressourcen überschritten während Abfrageausführung.
Job ID: Teads-1307: bquijob_257ce97b_1566a6a3f27

Antwort

1

Es ist eine Strombegrenzung, die Arrays (hergestellt von ARRAY_AGG oder anderen Mitteln) ist in dem Speicher einer einzelnen Maschine paßt. Wir haben kürzlich einige Verbesserungen vorgenommen, die dazu beitragen sollten, die für solche Abfragen erforderlichen Ressourcen zu reduzieren. Um zu bestätigen, ob dies das Problem ist, können Sie eine Abfrage versuchen, wie zum Beispiel:

SELECT 
    SUM(LENGTH(FORMAT("%t", response))) AS total_response_size 
FROM 
    rtb_response_logs.2016080515 
GROUP BY 
    response.auctionId, 
    response.scenarioId 
ORDER BY total_response_size DESC LIMIT 1; 

Diese formatiert die structs als Strings als grobe Heuristik, wie viel Speicher würde sie zu vertreten. Wenn das Ergebnis sehr groß ist, können wir die Abfrage möglicherweise restrukturieren, um weniger Speicher zu verwenden. Wenn das Ergebnis nicht sehr groß ist, dann ist ein anderes Problem in Sicht, und wir werden uns darum kümmern, es zu reparieren :) Danke!