sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan kan jeg forhindre Postgres i at indsætte en underforespørgsel?

Jeg tror OFFSET 0 er den bedre tilgang, da det mere åbenlyst er et hack, der viser, at der foregår noget mærkeligt, og det er usandsynligt, at vi nogensinde vil ændre optimeringsadfærden omkring OFFSET 0 ... hvor forhåbentlig CTE'er bliver inlineable på et tidspunkt CTE'er blev som standard inlineable i PostgreSQL 12. Følgende forklaring er for fuldstændighedens skyld; brug Seamus' svar.

For ukorrelerede underforespørgsler kunne du udnytte PostgreSQL 11 og ældres afvisning af at inline WITH forespørgselsvilkår for at omformulere din forespørgsel 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'];

Dette har stort set samme effekt som OFFSET 0 hack, og kan lide offset 0 hack udnytter særheder i Pg's optimizer, som folk bruger til at omgå Pgs mangel på forespørgselstip ... ved at bruge dem som forespørgselstip.

Men OFFSET 0 hack er noget officielt velsignet, mens CTE-misbrug ikke længere virker i PostgreSQL 12. (Yay!).



  1. SQL Inner Join

  2. PL/SQL-program til at udskrive medarbejderoplysninger

  3. SQL mellem ikke inklusive

  4. Hovedanvendelse af sys.dm_os_wait_stats