Jag tror att OFFSET 0 är det bättre tillvägagångssättet eftersom det mer uppenbart är ett hack som visar att något konstigt pågår, och det är osannolikt att vi någonsin kommer att ändra optimerarens beteende kring OFFSET 0 ... medan förhoppningsvis CTE:er kommer att bli inlineable någon gång CTE:er blev inlineable som standard i PostgreSQL 12. Följande förklaring är för fullständighetens skull; använd Seamus svar.
För okorrelerade underfrågor kan du utnyttja PostgreSQL 11 och äldres vägran att infoga WITH söktermer för att omformulera din fråga 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'];
Detta har ungefär samma effekt som OFFSET 0 hacka och gilla offset 0 hack utnyttjar egenheter i Pgs optimerare som människor använder för att komma runt Pgs brist på frågetips ... genom att använda dem som frågetips.
Men OFFSET 0 hack är något officiellt välsignat, medan CTE-missbruk inte längre fungerar i PostgreSQL 12. (Yay!).