PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verbesserung der Leistung von Postgres-jsonb-Abfragen in Kombination mit relationalen Abfragen

Ihre langsame Abfrage deTOASTing die großen jsonb-Daten für alle 44255 Zeilen und führt dann die analysierten Werte durch die Sortierung, um die obersten 20 Zeilen auszuwählen. (Ich weiß nicht, warum es das DeTOASTing so eifrig macht). Also wurden 44235 JSONB deTOASTed, nur um weggeworfen zu werden.

Ihre schnelle Abfrage gibt (vermutlich) TOAST-Zeiger aus dem Hash-Join zurück, sortiert die Zeilen mit diesen kleinen Zeigern und deTOASTet dann nur die 20 Überlebenden. Im Fall von EXPLAIN ANALYZE werden die Überlebenden nicht einmal deTOAST, sondern nur die Hinweise weggeworfen.

Das ist das "Warum", was dagegen zu tun ist, wenn Sie wirklich keine der Abfragen unter dem obersten Teil ändern können, bezweifle ich, dass Sie auf der Serverseite irgendetwas dagegen tun können.

Wenn Sie die Abfrage stärker modifizieren können, können Sie die Laufzeit mit einem CTE verbessern. Lassen Sie den CTE die gesamte jsonb auswählen, und dann zieht die Auswahl auf dem CTE den Wert daraus heraus.

WITH T as (select cfiles.property_values as "1907", <rest of query>) 
SELECT "1907"->>'name1', "1907"->>'name2', <rest of select list> from T;