Мисля, че OFFSET 0
е по-добрият подход, тъй като по-очевидно е хак, който показва, че се случва нещо странно и е малко вероятно някога да променим поведението на оптимизатора около OFFSET 0
... докато да се надяваме, че CTE ще станат нелинейни в някакъв момент CTE станаха вградени по подразбиране в PostgreSQL 12. Следното обяснение е за пълнота; използвайте отговора на Шеймъс.
За некорелирани подзаявки можете експлоатирайте отказа на PostgreSQL 11 и по-старите за вграден WITH
термини на заявка, за да префразирате заявката си като:
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'];
Това има почти същия ефект като OFFSET 0
hack и като offset 0
hack експлоатира странностите в оптимизатора на Pg, които хората използват, за да заобиколят липсата на подсказки за заявка в Pg ... като ги използват като съвети за заявка.
Но OFFSET 0
hack е донякъде официално благословен, докато злоупотребата с CTE вече не работи в PostgreSQL 12. (Да!).