[PostgreSQL] прооптимизировать запрос

laki


CREATE OR REPLACE VIEW exn_mainlist1 AS
SELECT a.id_moveservice, c.id_move, s.servicetitle, c.movedatefrom, c.movedateto, a.moveservicedatemodified AS modidate, d.clientfname AS firstname, d.clientlname AS lastname, d.clienttitle, (d.clientfname::text || ' '::text) || d.clientlname::text AS username, e.addressline1::text || ', '::text) || e.addresspostcode::text) || ' '::text) || e.addressline2::text AS oldaddress, f.addressline1::text || ', '::text) || f.addresspostcode::text) || ' '::text) || f.addressline2::text AS newaddress, upper("substring"("replace"("replace"(g.statustitle::text, 'SENT'::text, 'Unprocessed'::text 'CANCELED'::text, 'Cancelled'::text 1, 1 || lower("substring"("replace"("replace"(g.statustitle::text, 'SENT'::text, 'Unprocessed'::text 'CANCELED'::text, 'Cancelled'::text 2 AS status, _a.id_status, orgs.id_org, s.id_service, i.servicetypetitle AS servicetype, d.clientemail, d.clientcontactnum, e.addressline1 AS fromline1, e.addressline2 AS fromline2, e.addressline3 AS fromline3, e.addressline4 AS fromline4, e.addressline5 AS fromline5, e.addresspostcode AS frompostcode, f.addressline1 AS toline1, f.addressline2 AS toline2, f.addressline3 AS toline3, f.addressline4 AS toline4, f.addressline5 AS toline5, f.addresspostcode AS topostcode
FROM ( SELECT a_."time", a_.id_moveservice, a_.id_status
FROM ( SELECT exn_mainlist_helpful.id_moveservice, exn_mainlist_helpful."time", exn_mainlist_helpful.id_status
FROM exn_mainlist_helpful
) a_
WHERE a_."time" = SELECT max(b_."time") AS max
FROM ( SELECT exn_mainlist_helpful.id_moveservice, exn_mainlist_helpful."time", exn_mainlist_helpful.id_status
FROM exn_mainlist_helpful
) b_
WHERE a_.id_moveservice = b_.id_moveservice _a
JOIN moveservices a ON a.id_moveservice = _a.id_moveservice
JOIN services s USING (id_service)
JOIN moves c USING (id_move)
JOIN clients d USING (id_user)
JOIN addresses e ON c.id_addressfrom = e.id_address
JOIN addresses f ON c.id_addressto = f.id_address
JOIN moveservicestatuses g ON _a.id_status = g.id_status
JOIN orgs orgs ON s.id_org = orgs.id_org
JOIN servicetypes i ON s.id_servicetype = i.id_servicetype
WHERE (a.id_status IN ( SELECT moveservicestatuses.id_status
FROM moveservicestatuses
WHERE moveservicestatuses.statustitle::text = 'SENT'::text OR moveservicestatuses.statustitle::text = 'CANCELED'::text;
вот эта штука вызывается два раза и занимает больше всего времени реально ли ее вызвать один раз?
SELECT exn_mainlist_helpful.id_moveservice, exn_mainlist_helpful."time", exn_mainlist_helpful.id_status
FROM exn_mainlist_helpful

Marikun

вот эта штука вызывается два раза и занимает больше всего времени реально ли ее вызвать один раз?
Ну во первых стоит поппробовать избавиться от вложенного селекта, а выдернуть значение этого селекта во временную табличку, с которой потом джойнить.
Во-вторых, если он занимает большую часть подзапроса, то значит это крайне расточительно делать селф-джойн этой большой получившейся таблички с самой-собой.
Имхо, надо разбивать этот здоровый подзапрос на более мелкие и уходить от вложенных подзапросов к созданию промежуточных табличек и джойну с ними.

laki

спасибо. завтра попробую.
Оставить комментарий
Имя или ник:
Комментарий: