PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Възможно ли е да се отговори на запитвания за изглед, преди напълно да се материализира изгледът?

По принцип програмата за планиране на заявки на Postgres прави "вградени" изгледи за оптимизиране на цялата заявка. По документация:

Но не мисля, че Postgres е достатъчно умен за да заключи, че може да достигне същия резултат от базовата таблица без разрушаване на редове.

Можете да опитате тази алтернативна заявка с LATERAL присъединяване. По-чисто е:

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;

Също така става ясно, че един от (end_day , начален_ден ) е излишен.

Използване на LEFT JOIN защото това може да позволи на програмата за планиране на заявки да игнорира присъединяването от вашата заявка:

   SELECT DISTINCT type FROM v_mt_count_by_day;

Друго (с CROSS JOIN или INNER JOIN ) трябва оценете съединението, за да видите дали редовете от първата таблица са елиминирани.

Между другото, това е:

SELECT DISTINCT type ...

не:

SELECT DISTINCT(type) ...

Имайте предвид, че това връща дата вместо клеймото за време във вашия оригинал. Easer, и предполагам, че все пак това е, което искаш?

Изисква Postgres 9.3+ Подробности:

РЕДОВЕ ОТ в Postgres 9.4+

За да взривите двете колони успоредно безопасно :

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;

Основното предимство:Това няма да дерайлира в декартов продукт, ако двата SRF не върнат същия брой редове. Вместо това стойностите NULL ще бъдат подплатени.

Отново, не мога да кажа дали това би помогнало на инструмента за планиране на заявки с по-бърз план за тип DISTINCT без тестване.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Добавете секунди към клеймото за време

  2. Определяне на OID на таблица в Postgres 9.1?

  3. Пролетни данни, връщащи List<Object[]>

  4. Интегриране на инструменти за управление на PostgreSQL в производството

  5. Как мога да получа psycopg2 регистриране на времето за изпълнение на заявка?