Оптимизация с помощью запросов в PostgreSQL - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть рабочий запрос PostgreSQL, но он занимает значительное время для выполнения.Мне нужна помощь в ее оптимизации.

У меня есть:

  • Максимально удалено внутренних запросов.
  • Удалено ненужных данных из запроса.
  • Создано with запрос, который получает необходимые данные с начала

Мне нужна помощь для оптимизации этого запроса

    with data as (
      select
      e.id,
      e.name,
      t.barcode,
      tt.variant,
      t.cost_cents::decimal / 100 as ticket_cost,
      t.fee_cents::decimal / 100 as booking_fee
    from
      tickets t
      inner join events e on t.event_id = e.id
      inner join ticket_types tt on t.ticket_type_id = tt.id
    where
      t.status = 2
      and e.source in ('source1', 'source2')
    )
    select
      d.name,
      count(distinct d.barcode) as issued,
      (select count(distinct d2.barcode) from data d2 where d2.id = d.id and d2.variant is null) as sold,
      sum(d.ticket_cost) as ticket_revenue,
      sum(d.booking_fee) as booking_fees
    from
      data d
    group by
      id,
      name

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вы можете ускорить объединения, создав надлежащие индексы.

Кроме того, удалите подзапрос

(select count(distinct d2.barcode) from data d2 where d2.id = d.id and d2.variant is null)

из предложения SELECT и добавьте объединение в таблицу d2 примерно так:

select
  d.name,
  count(distinct d.barcode) as issued,
  count(distinct d2.barcode) as sold,
  sum(d.ticket_cost) as ticket_revenue,
  sum(d.booking_fee) as booking_fees
from
  data d
  left join data d2 on (d2.id = d.id and d2.variant is null)
group by
  d.id,
  d.name
0 голосов
/ 24 декабря 2018

Лучше обнаруживать медленные детали с помощью EXPLAIN .Он покажет стоимость всех частей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...