PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Melhorando o desempenho das consultas jsonb do Postgres combinadas com consultas relacionais


Sua consulta lenta está removendo os dados jsonb grandes para todas as 44255 linhas e, em seguida, transportando os valores analisados ​​pela classificação para selecionar as 20 principais linhas. (não sei porque faz o deTOASTing tão avidamente assim). Então 44235 JSONB foram deTOASTados apenas para serem jogados fora.

Sua consulta rápida está (presumivelmente) retornando ponteiros TOAST da junção de hash, classificando as linhas com esses pequenos ponteiros e, em seguida, eliminando apenas os 20 sobreviventes. No caso de EXPLAIN ANALYZE, ele nem mesmo deTOAST os sobreviventes, apenas joga os ponteiros fora.

Esse é o "porquê", quanto ao que fazer sobre isso, se você realmente não pode alterar nenhuma consulta abaixo da parte superior, duvido que haja algo que você possa fazer sobre isso no lado do servidor.

Se você puder modificar a consulta de forma mais substancial, poderá melhorar o tempo de execução com um CTE. Faça com que o CTE selecione todo o jsonb e, em seguida, o select no CTE extrai o valor dele.
WITH T as (select cfiles.property_values as "1907", <rest of query>) 
SELECT "1907"->>'name1', "1907"->>'name2', <rest of select list> from T;