Ещё с университетской скамьи в голове сохранилась прописная истина, что оператор LIKE – медленный. Так как он не использует для поиска значения индекс. Единственное исключение из правила – когда символ подстановки стоит в конце текста (ну это логично, правда-же). А вот если вначале или в середине текста, то увольте, будет скан таблицы. Уже видите в чём подвох? Нет? Тогда переходите к следующему абзацу.
Картина которая сохранилась после университета (подозреваю что не только у меня) не до конца верна. Да, если символ подстановки стоит вначале строки, то ничего не поделаешь (опять лукавлю, можно развернуть строку в обратном порядке и проиндексировать), но вот если символ подстановки стоит внутри текста, то SQL Server будет использовать индекс настолько, насколько сможет для того, чтобы ограничить выборку. Вот простенький пример запроса с LIKE и план запроса, показывающий как сработает LIKE:
SELECT Name FROM Users WHERE Name LIKE N'Jo%'
На картинке видно что LIKE раскладывается на два внутренних оператора, Name >= N’Jo’ и Name < N’JP’, что даёт возможность спозиционироваться по индексу и выбрать оптимальный план запроса. Здорово, правда?
Как вы думаете будет работать оптимизатор, если символ подстановки будет внутри текста? Смотрим.
SELECT TOP(3) Name FROM Users WHERE Name LIKE N'Jo% S%'
SQL Server для этой выборки просто отбросил часть предиката после первого %, сделал поиск по индексу, и пробегая по полученным по этому предикату записям применил уже оставшуюся часть фильтра. Кроме этого, посмотрите как работате TOP. В плане он идёт отдельным оператором, но он неразрывно связан с выборкой из индекса. SQL Server получает 1 строку, потом вторую, третью, после чего он понимает что есть ограничение TOP и смысла получать ещё одну строку нет. На этом операция прекращается и клиенту возвращаеся полученный набор.
Вроде-бы всё логично, так и должно это работать, и если просто подумать как это должно быть реализовано, то наверное и придумаешь то что сейчас есть. Но, когда я вижу что-то такое, и понимаю как оно работает, то у меня возникает эмоция: “Здорово! Правда?”
Всем хорошей рабочей недели, и ролик в тему: