Расширенное индексирование с использованием условий OR (pgsql)

я начинаю лучше понимать индексирование PostgreSQL, но яу нас возникла проблема с условным оператором OR, когда я нене знаю, как оптимизировать мои индексы для более быстрого запроса.

У меня есть 6 условных выражений, которые при индивидуальном запуске имеют небольшую стоимость. Вот's пример обрезанных запросов, включая план запроса, рассчитанный раз. (

ПРИМЕЧАНИЕ: у меня нетвыведите фактические планы запросов для этих запросов ниже для уменьшения сложности, но все они используютnested loop left joins а такжеindex scans как и следовало ожидать при правильной индексации. При необходимости я могу включить планы запросов для более значимого ответа.)

EXPLAIN ANALYZE SELECT t1.*, t2.*, t3.*
  FROM t1 LEFT JOIN t2 on t2.id = t1.t2_id LEFT JOIN t3 ON t3.id = t1.t3_id
 WHERE (conditions1)
 LIMIT 10;

QUERY PLAN
-------------------------------------------------------------------------------------
Limit  (cost=0.25..46.69 rows=1 width=171) (actual time=0.031..0.031 rows=0 loops=1)

EXPLAIN ANALYZE SELECT t1.*, t2.*, t3.*
  FROM t1 LEFT JOIN t2 on t2.id = t1.t2_id LEFT JOIN t3 ON t3.id = t1.t3_id
 WHERE (conditions2)
 LIMIT 10;

QUERY PLAN
-------------------------------------------------------------------------------------
Limit  (cost=0.76..18.97 rows=1 width=171) (actual time=14.764..14.764 rows=0 loops=1)

/* snip */

EXPLAIN ANALYZE SELECT t1.*, t2.*, t3.*
  FROM t1 LEFT JOIN t2 on t2.id = t1.t2_id LEFT JOIN t3 ON t3.id = t1.t3_id
 WHERE (conditions6)
 LIMIT 10;

QUERY PLAN
-------------------------------------------------------------------------------------
Limit  (cost=0.51..24.48 rows=1 width=171) (actual time=0.252..5.332 rows=10 loops=1)

Моя проблема в том, что я хочу объединить эти 6 условий вместе с операторами ИЛИ, чтобы сделать возможным каждое условие. Мой комбинированный запрос выглядит примерно так:

EXPLAIN ANALYZE SELECT t1.*, t2.*, t3.*
  FROM t1 LEFT JOIN t2 on t2.id = t1.t2_id LEFT JOIN t3 ON t3.id = t1.t3_id
 WHERE (conditions1 OR conditions2 OR conditions3 OR conditions4 OR conditions5 OR conditions 6)
 LIMIT 10;

К сожалению, это приводит к значительному увеличению плана запроса, который, похоже, больше не использует мои индексы (вместо этого, выбирая сделатьhash left join а неnested loop left joinи выполняя различныеsequence scans над ранее использованнымindex scans).

Limit  (cost=142.62..510755.78 rows=1 width=171) (actual time=30.591..30.986 rows=10 loops=1)

Есть ли что-то особенное, что я должен знать об индексации в отношении условий ИЛИ, которые могли бы улучшить мой окончательный запрос?

ОБНОВИТЬЕсли я использую UNION для каждого отдельного SELECT, это, кажется, ускоряет запрос. Однако, помешает ли это мне упорядочить результаты, если я решу в будущем? Вот'Что я сделал, чтобы ускорить запрос через UNION:

EXPLAIN ANALYZE
SELECT t1.*, t2.*, t3.*
  FROM t1 LEFT JOIN t2 on t2.id = t1.t2_id LEFT JOIN t3 ON t3.id = t1.t3_id
 WHERE (conditions1)
UNION
SELECT t1.*, t2.*, t3.*
  FROM t1 LEFT JOIN t2 on t2.id = t1.t2_id LEFT JOIN t3 ON t3.id = t1.t3_id
 WHERE (conditions2)
UNION
SELECT t1.*, t2.*, t3.*
  FROM t1 LEFT JOIN t2 on t2.id = t1.t2_id LEFT JOIN t3 ON t3.id = t1.t3_id
 WHERE (conditions3)
UNION
SELECT t1.*, t2.*, t3.*
  FROM t1 LEFT JOIN t2 on t2.id = t1.t2_id LEFT JOIN t3 ON t3.id = t1.t3_id
 WHERE (conditions4)
UNION
SELECT t1.*, t2.*, t3.*
  FROM t1 LEFT JOIN t2 on t2.id = t1.t2_id LEFT JOIN t3 ON t3.id = t1.t3_id
 WHERE (conditions5)
UNION
SELECT t1.*, t2.*, t3.*
  FROM t1 LEFT JOIN t2 on t2.id = t1.t2_id LEFT JOIN t3 ON t3.id = t1.t3_id
 WHERE (conditions6)
 LIMIT 10;

QUERY PLAN
-------------------------------------------------------------------------------------
Limit  (cost=219.14..219.49 rows=6 width=171) (actual time=125.579..125.653 rows=10 loops=1)

Ответы на вопрос(2)

Ваш ответ на вопрос