Myslím, že OFFSET 0
je lepší přístup, protože je to zřejmější hack ukazující, že se děje něco divného, a je nepravděpodobné, že někdy změníme chování optimalizátoru kolem OFFSET 0
... kdežto doufejme, že CTE budou v určitém okamžiku inlineable CTE se staly v PostgreSQL 12 standardně inlineable. Následující vysvětlení je pro úplnost; použijte Seamusovu odpověď.
U nekorelovaných poddotazů můžete zneužít odmítnutí PostgreSQL 11 a starších vložit WITH
výrazy dotazu a přeformulujte váš dotaz 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'];
To má téměř stejný účinek jako OFFSET 0
hack a jako offset 0
hack využívá vtípky v optimalizátoru Pg, které lidé používají k tomu, aby se vyhnuli nedostatku tipů dotazů Pg... tím, že je používají jako nápovědu k dotazu.
Ale OFFSET 0
hack je poněkud oficiálně požehnaný, protože zneužívání CTE již v PostgreSQL 12 nefunguje. (Jo!).