111 записей предполагают, что second_name не содержит ожидаемого значения; как вы захватываете &&secondary_name
, и можете ли вы проверить значение, которое оно на самом деле имеет до и после пропущенного раздела проверки? Судя по результатам, он содержит «%», а не «9», но я полагаю, вы уже это проверили.
Проблема скорости предполагает, что оптимизатор меняет поведение, изменяя порядок соединения и / или используемые индексы. По умолчанию это может быть соединение каждой строки street
с каждой записью address
, имеющей камбурнский корт, и только после этого проверка зависимостей, но она будет немного отличаться в зависимости от того, какие индексы он использует и какие-либо характеристики которые доступны. Разница в том, что с литералами, даже если вы используете like
, здесь нет подстановочных знаков, поэтому он может знать, что может использовать индекс для primary_name и / или second_name; в переменной версии он не может знать, что при разборе запроса он должен принимать худший случай, который будет равен «%». Что он может на самом деле получить, если он возвращает 111 адресов.
Без explain plan
трудно точно угадать, что происходит, но вы можете попробовать добавить несколько подсказок оптимизатора, чтобы хотя бы попытаться получить правильный порядок соединения, и даже использовать индекс - хотя это, возможно, не должно остаться на месте, если вы можете когда-либо иметь значения, начинающиеся с%. Это может сказать вам, что делается по-другому.