Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Как ускорить выборку из вью?  [new]
Ролг Хупин
Member

Откуда: Оттуда
Сообщений: 1446
Есть такой вью и функция, выборка из этого вью работает долго, и это из-за функции, поскольку, когда заглушил ее (см. ниже)
все летает.Как ускорить?
Раскрутить функцию в запросе?

CREATE VIEW public.v_deals_and_customer
AS
SELECT t.company AS customer,
    t.forename,
    t.surname,
    s.company AS supplier,
    u.user_name,
    s.sales_contact,
    d.supplier_id,
    d.customer_id,
    d.deal_no,
    d.capital_cost,
    d.equipment_breakdown,
    d.payment_term,
    d.payment_profile_1,
    d.payment_profile_2,
    d.billing,
    d.notes,
    d.state,
    d.bylender,
    d.ref_number,
    d.upgrade,
    d.special,
    d.rental,
    d.reason,
    d.term,
    d.state_date,
    d.docs_received,
    d.docs_sent,
    d.gross_profit,
    d.deferal_payment,
    d.suppliers_comission,
    d.title_sent_date,
    d.title_paid_date,
    d.paid_date,
    d.paid,
    d.user_id_paid,
    d.eq_code,
    t.address AS customer_address,
    s.address AS supplier_address,
    --now() AS estimate_completion_date  --<----- заглушка
   getestimationdate(d.deal_no) AS estimate_completion_date
FROM deals d
     JOIN customers t ON d.customer_id = t.id
     JOIN suppliers s ON d.supplier_id = s.id
     JOIN users u ON s.agent_id = u.user_id;
     
---- 
     
CREATE OR REPLACE FUNCTION public.getestimationdate (
  _dealno integer
)
RETURNS TIMESTAMP WITHOUT TIME ZONE AS
$body$
	select    a.msg_date + payment_term * INTERVAL '1 month'
    --DATEADD(MONTH,payment_term,a.msg_date)
	from deals d
    inner join  crm_activity a
    on d.deal_no=a.msg_dealno
	and a.msg_text ilike '%Paid%'
	and d.deal_no=_dealno
    and d.state_date is not null
    limit 1;
$body$
LANGUAGE 'sql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100; 
23 сен 17, 11:01    [20817842]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выборку из вью?  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 3361
Ролг Хупин,

Сделать explain analyze для запроса внутри функции и посмотреть на него внимательно. Может что то прояснится.
Или индекс где то забыли или еще что.
Первично 3 версии могу высказать:
1)тупо забытый индекс где то на d.deal_no или на a.msg_dealno
2)исключительно дурная по своей вообще сути идея делать бизеслогику логику на ilike a.msg_text ilike '%Paid%'
3)LIMIT 1 без ORDER BY

а точнее надо на explain analyze смотреть.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
23 сен 17, 11:20    [20817855]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выборку из вью?  [new]
Ролг Хупин
Member

Откуда: Оттуда
Сообщений: 1446
Maxim Boguk
Ролг Хупин,

Сделать explain analyze для запроса внутри функции и посмотреть на него внимательно. Может что то прояснится.
Или индекс где то забыли или еще что.
Первично 3 версии могу высказать:
1)тупо забытый индекс где то на d.deal_no или на a.msg_dealno
2)исключительно дурная по своей вообще сути идея делать бизеслогику логику на ilike a.msg_text ilike '%Paid%'
3)LIMIT 1 без ORDER BY

а точнее надо на explain analyze смотреть.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru



Не то слово! но не мы такие - время такое (ц)

d.deal_no ПК, а на a.msg_dealno добавил индекс, полегчало
23 сен 17, 11:54    [20817888]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить