PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Amélioration des performances des requêtes Postgres jsonb combinées aux requêtes relationnelles

Votre requête lente déTOASTe les grandes données jsonb pour les 44255 lignes, puis transporte les valeurs analysées à travers le tri pour sélectionner les 20 premières lignes. (Je ne sais pas pourquoi il fait le deTOASTing avec impatience comme ça). Donc 44235 JSONB ont été détoastés juste pour être jetés.

Votre requête rapide renvoie (vraisemblablement) des pointeurs TOAST à partir de la jointure de hachage, triant les lignes avec ces petits pointeurs, puis déTOASTant uniquement les 20 survivants. Dans le cas d'EXPLAIN ANALYZE, il ne détoast même pas les survivants, il jette simplement les pointeurs.

C'est le "pourquoi", quant à ce qu'il faut faire à ce sujet, si vous ne pouvez vraiment pas modifier l'une des requêtes en dessous de la partie supérieure, je doute que vous puissiez faire quoi que ce soit côté serveur.

Si vous pouvez modifier la requête de manière plus substantielle, vous pouvez améliorer le temps d'exécution avec un CTE. Demandez au CTE de sélectionner le jsonb entier, puis la sélection sur le CTE en extrait la valeur.

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