Jeg tror OFFSET 0
er den bedre tilgang, da det mere åbenlyst er et hack, der viser, at der foregår noget mærkeligt, og det er usandsynligt, at vi nogensinde vil ændre optimeringsadfærden omkring OFFSET 0
... hvor forhåbentlig CTE'er bliver inlineable på et tidspunkt CTE'er blev som standard inlineable i PostgreSQL 12. Følgende forklaring er for fuldstændighedens skyld; brug Seamus' svar.
For ukorrelerede underforespørgsler kunne du udnytte PostgreSQL 11 og ældres afvisning af at inline WITH
forespørgselsvilkår for at omformulere din forespørgsel som:
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'];
Dette har stort set samme effekt som OFFSET 0
hack, og kan lide offset 0
hack udnytter særheder i Pg's optimizer, som folk bruger til at omgå Pgs mangel på forespørgselstip ... ved at bruge dem som forespørgselstip.
Men OFFSET 0
hack er noget officielt velsignet, mens CTE-misbrug ikke længere virker i PostgreSQL 12. (Yay!).