2017-09-29 2 views
0

Ich habe eine Tabelle in Postgres mit einer JSONB-Spalte, jede Zeile der Tabelle enthält ein großes JSONB-Objekt (~ 4500 Schlüssel, JSON-Zeichenfolge ist etwa 110 KB in einer TXT-Datei). Ich möchte diese Zeilen abfragen und das gesamte JSONB-Objekt abrufen.Zurückgeben von JSON aus Postgres ist langsam

Die Abfrage ist schnell - wenn ich EXPLAIN ANALYZE ausführen oder die JSONB-Spalte weglassen, wird in 100-300 ms zurückgegeben. Aber wenn ich die vollständige Abfrage ausführe, dauert es in der Größenordnung von Minuten. Die gleiche Abfrage auf einer früheren Version der Daten war auch schnell (jeder JSONB war etwa halb so groß).

Einige Anmerkungen:

  • Dieser endet in Python oben (über SQLAlchemy/psycopg2). Ich mache mir Sorgen, dass der Abfrage-Executor JSONB in ​​JSON konvertiert, dann wird er für die Übertragung über den Draht in Text codiert und dann am Python-Ende wieder JSON-codiert. Ist das korrekt? Wenn ja, wie könnte ich dieses Problem mildern? Wenn ich die JSONB-Spalte als ::text auswähle, ist die Abfrage ungefähr doppelt so schnell.

  • Ich brauche nur eine kleine Teilmenge des JSON (ca. 300 Schlüssel oder 6% der Schlüssel). Ich habe versucht, die JSON-Ausgabe in der Abfrage zu filtern, aber sie verursachte einen erheblichen weiteren Leistungseinbruch - es war schneller, das gesamte Objekt zurückzugeben.

+0

Versuchen Sie zunächst, die Abfrage in pure sql zu erstellen und auszuführen, und führen Sie sie auf demselben Knoten wie der postgres-Server aus (wenn möglich). Dadurch werden alle Probleme mit sqlalchemy/network beseitigt. Geben Sie als Nächstes weitere Informationen zu den Daten und der tatsächlichen SQL-Ausführung an, die Sie ausgeführt haben. und die Abfragezeiten. –

+0

@JonScott, wenn Sie sagen, die Abfrage in reinem SQL umschreiben, bedeutet dies, dass ich im Wesentlichen alle PostgreSQL-spezifischen Funktionen (wie JSON) entfernen sollte? – glifchits

Antwort

0

Dies ist nicht unbedingt eine Lösung ist, aber hier ist ein Update:

Durch die JSON Spalte text in der Postgres Abfrage Gießen, konnte ich auf dem Abrufen der Ausführung der Abfrage und Ergebnisse wesentlich abgeholzt Python Ende.

Auf der Python-Ende, mich json.loads für jede einzelne Zeile in der Ergebnismenge tun, bringt mich zum genauen Zeitpunkt als mit der regulären Abfrage. Mit der Bibliothek ujson konnte ich jedoch eine signifikante Beschleunigung erzielen. Die Leistung des Umwandelns in Text in der Abfrage und das anschließende Aufrufen von ujson.loads auf dem Python-Ende ist ungefähr 3x schneller als das einfache Zurückgeben von JSON in der Abfrage.