sql >> Database >  >> RDS >> PostgreSQL

Hoe kan ik voorkomen dat Postgres een subquery inline invult?

Ik denk OFFSET 0 is de betere benadering, omdat het meer duidelijk een hack is die aantoont dat er iets raars aan de hand is, en het is onwaarschijnlijk dat we het gedrag van de optimizer rond OFFSET 0 ooit zullen veranderen ... waar hopelijk zullen CTE's op een gegeven moment inlineable worden CTE's werden standaard inlineable in PostgreSQL 12. De volgende uitleg is voor de volledigheid; gebruik het antwoord van Seamus.

Voor niet-gecorreleerde subquery's zou misbruik maken van de weigering van PostgreSQL 11 en ouder om WITH inline te plaatsen zoektermen om uw vraag te herformuleren als:

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'];

Dit heeft vrijwel hetzelfde effect als de OFFSET 0 hack, en zoals de offset 0 hack maakt gebruik van eigenaardigheden in Pg's optimizer die mensen gebruiken om Pg's gebrek aan queryhints te omzeilen ... door ze te gebruiken als queryhints.

Maar de OFFSET 0 hack is enigszins officieel gezegend, terwijl CTE-misbruik niet meer werkt in PostgreSQL 12. (Yay!).



  1. Tabellen koppelen met behulp van de Room-database in Android Studio

  2. TAN() Voorbeelden in SQL Server

  3. Dynamische SQL om kolomnamen te genereren?

  4. SQL Server 2014 verkennen SELECT INTO Parallelism