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

Wie kann ich verhindern, dass Postgres eine Unterabfrage inliniert?

Ich denke OFFSET 0 ist der bessere Ansatz, da es offensichtlicher ein Hack ist, der zeigt, dass etwas Seltsames vor sich geht, und es unwahrscheinlich ist, dass wir jemals das Verhalten des Optimierers um OFFSET 0 ändern werden ... wohingegen CTEs hoffentlich irgendwann inlinefähig werden CTEs wurden in PostgreSQL 12 standardmäßig inlinefähig. Die folgende Erklärung dient der Vollständigkeit; benutze Seamus' Antwort.

Für nicht korrelierte Unterabfragen können Sie können nutzt die Weigerung von PostgreSQL 11 und älter aus, WITH zu inlinen Abfragebegriffe, um Ihre Abfrage wie folgt umzuformulieren:

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'];

Dies hat ungefähr die gleiche Wirkung wie OFFSET 0 hacken und wie der offset 0 hack nutzt Macken im Optimierer von Pg aus, die verwendet werden, um den Mangel an Abfragehinweisen von Pg zu umgehen ... indem sie als Abfragehinweise verwendet werden.

Aber der OFFSET 0 hack ist etwas offiziell gesegnet, während CTE-Missbrauch in PostgreSQL 12 nicht mehr funktioniert. (Juhu!).