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!).