sql >> Databasteknik >  >> RDS >> PostgreSQL

Är det möjligt att besvara frågor om en vy innan vyen blir helt realiserad?

I allmänhet gör det Postgres frågeplanerare "inline" vyer för att optimera hela frågan. Per dokumentation:

Men jag tycker inte att Postgres är tillräckligt smart att dra slutsatsen att den kan nå samma resultat från bastabellen utan att rader exploderar.

Du kan prova den här alternativa frågan med en LATERAL Ansluta sig. Det är renare:

CREATE OR REPLACE VIEW runinfo.v_mt_count_by_day AS
SELECT m.run_id, m.type, m.brand
     , m.start_day + c.rn - 1 AS row_date
     , c.row_count
FROM   runinfo.mt_count_by_day m
LEFT   JOIN LATERAL unnest(m.counts) WITH ORDINALITY c(row_count, rn) ON true;

Det klargör också att en av (end_day , start_day ) är överflödig.

Använder LEFT JOIN eftersom det kan tillåta frågeplaneraren att ignorera kopplingen från din fråga:

   SELECT DISTINCT type FROM v_mt_count_by_day;

Annars (med en CROSS JOIN eller INNER JOIN ) det måste utvärdera kopplingen för att se om rader från den första tabellen är eliminerade.

BTW, det är:

SELECT DISTINCT type ...

inte:

SELECT DISTINCT(type) ...

Observera att detta returnerar ett datum istället för tidsstämpeln i originalet. Lättare, och jag antar att det är vad du vill ha ändå?

Kräver Postgres 9.3+ Detaljer:

RADER FRÅN i Postgres 9.4+

Att explodera båda kolumnerna parallellt säkert :

CREATE OR REPLACE VIEW runinfo.v_mt_count_by_day AS
SELECT m.run_id, m.type, m.brand
       t.row_date::date, t.row_count
FROM   runinfo.mt_count_by_day m
LEFT   JOIN LATERAL ROWS FROM (
          unnest(m.counts)
        , generate_series(m.start_day, m.end_day, interval '1d')
       ) t(row_count, row_date) ON true;

Den största fördelen:Detta skulle inte spåra ur in i en kartesisk produkt om de två SRF inte returnerar samma antal rader. Istället skulle NULL-värden utfyllas.

Återigen, jag kan inte säga om detta skulle hjälpa frågeplaneraren med en snabbare plan för DISTINCT-typ utan att testa.




  1. MySQLdb kan inte initiera teckenuppsättning utf-8 fel

  2. SQL-fråga; horisontellt till vertikalt

  3. Hur TO_BASE64()-funktionen fungerar i MySQL

  4. Hur infogar man i tabellnamnet som alias med hjälp av pg-promise insert helper?