sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo puedo evitar que Postgres inserte una subconsulta?

Creo que OFFSET 0 es el mejor enfoque ya que es más obvio que es un truco que muestra que algo raro está pasando, y es poco probable que alguna vez cambiemos el comportamiento del optimizador alrededor de OFFSET 0 ... mientras que esperemos que los CTE se vuelvan inlineables en algún momento Los CTE se volvieron inlineables de forma predeterminada en PostgreSQL 12. La siguiente explicación es completa; usa la respuesta de Seamus.

Para subconsultas no correlacionadas, podría explotar la negativa de PostgreSQL 11 y versiones anteriores a WITH en línea términos de consulta para reformular su 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'];

Esto tiene el mismo efecto que OFFSET 0 piratear y darle me gusta al offset 0 hack explota peculiaridades en el optimizador de Pg que la gente usa para sortear la falta de sugerencias de consulta de Pg... usándolas como sugerencias de consulta.

Pero el OFFSET 0 hack es algo bendecido oficialmente, mientras que el abuso de CTE ya no funciona en PostgreSQL 12. (¡Yay!).