У меня есть следующий оператор, чтобы найти однозначные имена в моих данных (~ 1 миллион записей):
select Prename, Surname from person p1
where Prename is not null and Surname is not null
and not exists (
select * from person p2 where (p1.Surname = p2.Surname OR p1.Surname = p2.Altname)
and p2.Prename LIKE CONCAT(CONCAT('%', p1.Prename), '%') and p2.id <> p1.id
) and inv_date IS NULL
Oracle показывает огромную стоимость в 1477315000 и исполнение не заканчивается через 5 минут. Простое разделение OR на отдельный подпункт exists увеличивает производительность до 0,5 с и стоит до 45000:
select Prename, Surname from person p1
where Prename is not null and Surname is not null
and not exists (
select * from person p2 where p1.Surname = p2.Surname and
p2.Prename LIKE CONCAT(CONCAT('%', p1.Prename), '%') and p2.id <> p1.id
) and not exists (
select * from person p2 where p1.Surname = p2.Altname and
p2.Prename LIKE CONCAT(CONCAT('%', p1.Prename), '%') and p2.id <> p1.id
) and inv_date IS NULL
Не мой вопрос - настраивать это как можно лучше, так как это редко выполняемый запрос, и я знаю, что CONTACT превосходит любой индекс, но мне просто интересно, откуда такая высокая стоимость. Оба запроса мне кажутся семантически эквивалентными.