Алгоритм наклона Один, оптимизировать запрос - PullRequest
2 голосов
/ 30 августа 2011

Я пытаюсь реализовать алгоритм наклон один .У меня есть система онлайн-консультаций, и эксперт может проконсультироваться с пользователем.Эксперт - пользователь с типом = 2.И мне нужно сделать функционал "кто советовался с этим экспертом, то и советовался с".Подзапросы возвращают массив с последовательностью 0 (не используется), 1 (не используется) для expert_id1 и expert_id2, но эта последовательность состоит из более чем 100 000 значений, и этот запрос выполняется очень медленноПожалуйста, любые идеи для оптимизации этого запроса.

SELECT  e1.id as expert_id1, e2.id as expert_id2,
      (
         SELECT array_accum(c.consulted) FROM (
           SELECT CASE WHEN (c.id is null) THEN 0 ELSE 1 END as consulted
           FROM co_user u
           CROSS JOIN user e
           LEFT JOIN consultation c ON e.id = c.expert_id and c.user_id = u.id
           WHERE e.type = 2 AND e.id = e1.id) as c
       ) as expert_id1_consulted,
      (
         SELECT array_accum(c.consulted) FROM (
           SELECT CASE WHEN (c.id is null) THEN 0 ELSE 1 END as consulted
           FROM user u
           CROSS JOIN user e
           LEFT JOIN consultation c ON e.id = c.expert_id and c.user_id = u.id
           WHERE e.type = 2 AND e.id = e2.id) as c
       ) as expert_id2_consulted
FROM user e1
CROSS JOIN user e2
WHERE e1.type = 2 AND
      e2.type = 2 AND
      e2.id > e1.id
ORDER BY e1.id

1 Ответ

0 голосов
/ 22 марта 2013

Хотя вывод объяснения анализа был бы очень полезен, в этом запросе есть пара красных флажков.Я предпочитаю избегать подвыборов в списке столбцов в той степени, в которой этого можно избежать, поскольку это снижает читабельность.

Однако в этом случае ваши подпланы создают ненужные объединения через потенциально большие таблицы.что нужно сделать, это выделить эти подвыборки.Они затрудняют чтение и отслеживание вашего запроса, а также добавляют несколько повторяющихся объединений, которые означают дополнительное сканирование, возможно, больших таблиц.Например, вы можете поместить CASE внутри array_agg и т. П.

Если это не сработает, пожалуйста, опишите результаты анализа, и мы можем посмотреть на индексы оттуда.

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