По принцип програмата за планиране на заявки на 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
без тестване.