В настоящее время у меня есть два разных запроса, которые возвращают абсолютно одинаковые результаты, однако изменение параметра, по которому фильтруются результаты, заставляет их вести себя совсем по-другому.
Результаты при поиске cartography
запрос № 1: 22 строки / ~ 860 мс;
SELECT eid FROM t_entidades
WHERE eid IN (
SELECT eid
FROM t_entidades
WHERE entidade_t LIKE '%cartography%'
)
OR eid IN (
SELECT entidade as eid
FROM t_entidade_actividade ea
LEFT JOIN t_actividades a ON a.aid = ea.actividade
WHERE a.actividade LIKE '%cartography%'
)
запрос № 2: 22 строки / ~ 430 мс;
SELECT eid FROM t_entidades WHERE entidade_t LIKE '%cartography%'
UNION
SELECT entidade as eid
FROM t_entidade_actividade ea
LEFT JOIN t_actividades a ON a.aid = ea.actividade
WHERE a.actividade LIKE '%cartography%'
Результаты при поиске cart
запрос № 1: 715 строк / ~ 870 мс;
запрос № 2: 715 строк / ~ 450 мс
Результаты при поиске car
query # 1: никогда не ждал достаточно долго ... кажется, что это займет вечность и более 1 с будет слишком много
-- EXPLAIN OUTPUT:
"QUERY PLAN"
"Seq Scan on t_entidades (cost=44997.40..219177315.47 rows=500127 width=4)"
" Filter: ((SubPlan 1) OR (hashed SubPlan 2))"
" SubPlan 1"
" -> Materialize (cost=37712.46..38269.55 rows=40009 width=4)"
" -> Seq Scan on t_entidades (cost=0.00..37515.45 rows=40009 width=4)"
" Filter: ((entidade_t)::text ~~ '%car%'::text)"
" SubPlan 2"
" -> Hash Join (cost=36.48..7284.20 rows=298 width=4)"
" Hash Cond: (ea.actividade = a.aid)"
" -> Seq Scan on t_entidade_actividade ea (cost=0.00..5826.63 rows=378163 width=8)"
" -> Hash (cost=36.46..36.46 rows=1 width=4)"
" -> Seq Scan on t_actividades a (cost=0.00..36.46 rows=1 width=4)"
" Filter: ((actividade)::text ~~ '%car%'::text)"
запрос № 2: 23661 строк / ~ 860 мс
-- EXPLAIN OUTPUT:
"QUERY PLAN"
"HashAggregate (cost=45303.48..45706.55 rows=40307 width=4)"
" -> Append (cost=0.00..45202.72 rows=40307 width=4)"
" -> Seq Scan on t_entidades (cost=0.00..37515.45 rows=40009 width=4)"
" Filter: ((entidade_t)::text ~~ '%car%'::text)"
" -> Hash Join (cost=36.48..7284.20 rows=298 width=4)"
" Hash Cond: (ea.actividade = a.aid)"
" -> Seq Scan on t_entidade_actividade ea (cost=0.00..5826.63 rows=378163 width=8)"
" -> Hash (cost=36.46..36.46 rows=1 width=4)"
" -> Seq Scan on t_actividades a (cost=0.00..36.46 rows=1 width=4)"
" Filter: ((actividade)::text ~~ '%car%'::text)"
Итак, поиск car
с использованием запроса # 1, кажется, занимает вечность ... Что забавно, учитывая, что SELECT eid FROM t_entidades
занимает всего около 4 с, возвращая все 350k + строк ...
Единственное различие между EXPLAIN
s для запроса # 1 на разных этапах состоит в том, что для car
появляется следующая строка: "-> Материализация (стоимость = 37712.46..38269.55 строк = 40009 ширина = 4)"
Если кто-то захочет объяснить, почему запрос № 1 занимает так много времени для выполнения в последнем примере, и что именно происходит на каждом этапе объяснения, это было бы очень ценно, потому что я, кажется, никогда не получал его ...