Почему стоимость SQL резко возрастает с помощью простого «или»?

У меня есть следующий оператор, чтобы найти однозначные имена в моих данных (~ 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 превосходит любой индекс, но мне просто интересно, откуда такая высокая стоимость. Оба запроса мне кажутся семантически эквивалентными.

7
задан stracktracer 23 May 2011 в 14:41
поделиться