Почему небольшое изменение в поисковом запросе так сильно замедляет запрос?
У меня есть следующий запрос в PostgreSQL (9.5.1):
select e.id, (select count(id) from imgitem ii where ii.tabid = e.id and ii.tab = 'esp') as imgs,
e.ano, e.mes, e.dia, cast(cast(e.ano as varchar(4))||'-'||right('0'||cast(e.mes as varchar(2)),2)||'-'|| right('0'||cast(e.dia as varchar(2)),2) as varchar(10)) as data,
pl.pltag, e.inpa, e.det, d.ano anodet, coalesce(p.abrev,'')||' ('||coalesce(p.prenome,'')||')' determinador, d.tax, coalesce(v.val,v.valf)||' '||vu.unit as altura,
coalesce(v1.val,v1.valf)||' '||vu1.unit as DAP, d.fam, tf.nome família, d.gen, tg.nome gênero, d.sp, ts.nome espécie, d.inf, e.loc, l.nome localidade, e.lat, e.lon
from esp e
left join det d on e.det = d.id
left join tax tf on d.fam = tf.oldfam
left join tax tg on d.gen = tg.oldgen
left join tax ts on d.sp = ts.oldsp
left join tax ti on d.inf = ti.oldinf
left join loc l on e.loc = l.id
left join pess p on p.id = d.detby
left join var v on v.esp = e.id and v.key = 265
left join varunit vu on vu.id = v.unit
left join var v1 on v1.esp = e.id and v1.key = 264
left join varunit vu1 on vu1.id = v1.unit
left join pl on pl.id = e.pl
WHERE unaccent(TEXT(coalesce(p.abrev,'')||' ('||coalesce(p.prenome,'')||')')) ilike unaccent('%vicen%')
Требуется 430 мс, чтобы получить 1129 строк из общего количества 9250 вesp
Таблица.
Если я изменю условие поиска с%vicen%
в%vicent%
(добавляя 't'), для получения тех же 1129 строк требуется 431 мс.
Упорядочив по столбцу поиска, по возрастанию и по убыванию, я вижу, что все 1129 строк имеют одинаковое имя в обоих случаях.
Теперь странно: если я изменю поисковый запрос с%vicent%
в%vicenti%
(добавив «я»), теперь это занимает невероятно24,4 секунды чтобы получить те же 1129 строк!
Искомый термин всегда в первомcoalesce
т.е.coalesce(p.abrev,'')
, Я ожидаю, что запрос будет выполняться медленнее или быстрее, в зависимости от размера искомой строки, но не намного !! Кто-нибудь имеет представление о том, что происходит?
РезультатыEXPLAIN ANALYZE
(здесь будет превышено ограничение в 30 тыс. символов):
За%vicen%
: http://explain.depesz.com/s/2XF
За%vicenti%
: http://explain.depesz.com/s/dEc6