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

Como posso impedir que o Postgres inline uma subconsulta?


Acho que OFFSET 0 é a melhor abordagem, pois é mais obviamente um hack mostrando que algo estranho está acontecendo, e é improvável que mudemos o comportamento do otimizador em torno de OFFSET 0 ... onde esperamos que os CTEs se tornem inlineáveis ​​em algum momento CTEs tornaram-se inlineáveis ​​por padrão no PostgreSQL 12. A explicação a seguir é para ser completa; use a resposta de Seamus.

Para subconsultas não correlacionadas, você poderia explorar a recusa do PostgreSQL 11 e anteriores em inline WITH termos de consulta para reformular sua consulta como:
WITH t AS (
    SELECT * FROM tbl WHERE id IN ('6d48fc431d21', 'd9e659e756ad')
)
SELECT COUNT(*) 
FROM t 
WHERE data ? 'building_floorspace' 
AND data ?| ARRAY['elec_mean_monthly_use', 'gas_mean_monthly_use'];

Isso tem o mesmo efeito que o OFFSET 0 hack e como o offset 0 hack explora peculiaridades no otimizador do Pg que as pessoas usam para contornar a falta de dicas de consulta do Pg ... usando-as como dicas de consulta.

Mas o OFFSET 0 hack é um pouco oficialmente abençoado, enquanto o abuso de CTE não funciona mais no PostgreSQL 12. (Yay!).