Myślę, że OFFSET 0
jest lepszym podejściem, ponieważ jest to bardziej oczywisty hack pokazujący, że dzieje się coś dziwnego i jest mało prawdopodobne, abyśmy kiedykolwiek zmienili zachowanie optymalizatora wokół OFFSET 0
... podczas gdy miejmy nadzieję, że CTE w pewnym momencie staną się nieliniowe CTE stały się domyślnie inlineable w PostgreSQL 12. Poniższe wyjaśnienie ma na celu zapewnienie kompletności; skorzystaj z odpowiedzi Seamusa.
W przypadku nieskorelowanych podzapytań możesz wykorzystać odmowę PostgreSQL 11 i starszych do inline WITH
terminy zapytania, aby przeformułować zapytanie jako:
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'];
Ma to taki sam efekt jak OFFSET 0
hack i jak offset 0
hack wykorzystuje dziwactwa w optymalizatorze Pg, których ludzie używają do obejścia braku podpowiedzi do Pg... używając ich jako podpowiedzi do zapytań.
Ale OFFSET 0
hack jest nieco oficjalnie błogosławiony, podczas gdy nadużywanie CTE nie działa już w PostgreSQL 12. (Yay!).