Как оптимизировать операторы OR в состоянии ON в PostgreSQL? - PullRequest
0 голосов
/ 31 августа 2018

У меня такой запрос:

SELECT a.*
FROM a
LEFT JOIN b
  ON b.a_id = a.id
LEFT JOIN c
  ON c.a_id = a.id
LEFT JOIN (/* some complex subquery */) AS q
  ON q.id = a.id OR q.id = b.id OR q.id = c.id

Очевидно, что это не оптимально, потому что использование OR в состоянии ON делает планировщик неспособным использовать индексы.

Я пытался переписать это так:

WITH (/* some complex subquery */) AS q
SELECT a.*
FROM a
LEFT JOIN q AS qa
  ON qa.id = a.id
LEFT JOIN b
  ON b.a_id = a.id
LEFT JOIN q AS qb
  ON qb.id = b.id
LEFT JOIN c
  ON c.a_id = a.id
LEFT JOIN q AS qc
  ON qc.id = c.id
WHERE COALESCE(qa.id, qb.id, qc.id) IS NOT NULL

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

Есть ли методика оптимизации такого рода объединений? Если нет, то как я могу изменить схему?

...