LIKE as it looks like

4. March 2013 20:03 by Denis Reznik in SQL Server, LIKE, Execution Plan, fun  //  Tags:   //   Comments

        Ещё с университетской скамьи в голове сохранилась прописная истина, что оператор LIKE – медленный. Так как он не использует для поиска значения индекс. Единственное исключение из правила – когда символ подстановки стоит в конце текста (ну это логично, правда-же). А вот если вначале или в середине текста, то увольте, будет скан таблицы. Уже видите в чём подвох? Нет? Тогда переходите к следующему абзацу.

        Картина которая сохранилась после университета (подозреваю что не только у меня) не до конца верна. Да, если символ подстановки стоит вначале строки, то ничего не поделаешь (опять лукавлю, можно развернуть строку в обратном порядке и проиндексировать), но вот если символ подстановки стоит внутри текста, то SQL Server будет использовать индекс настолько, насколько сможет для того, чтобы ограничить выборку. Вот простенький пример запроса с LIKE и план запроса, показывающий как сработает LIKE:

SELECT Name FROM Users WHERE Name LIKE N'Jo%'

 

image

 

На картинке видно что LIKE раскладывается на два внутренних оператора, Name >= N’Jo’ и Name < N’JP’, что даёт возможность спозиционироваться по индексу и выбрать оптимальный план запроса. Здорово, правда?

Как вы думаете будет работать оптимизатор, если символ подстановки будет внутри текста? Смотрим.

SELECT TOP(3) Name FROM Users WHERE Name LIKE N'Jo% S%'

image

 

 

 

 

 

 

 

 

 

SQL Server для этой выборки просто отбросил часть предиката после первого %, сделал поиск по индексу, и пробегая по полученным по этому предикату записям применил уже оставшуюся часть фильтра. Кроме этого, посмотрите как работате TOP. В плане он идёт отдельным оператором, но он неразрывно связан с выборкой из индекса. SQL Server получает 1 строку, потом вторую, третью, после чего он понимает что есть ограничение TOP и смысла получать ещё одну строку нет. На этом операция прекращается и клиенту возвращаеся полученный набор.

Вроде-бы всё логично, так и должно это работать, и если просто подумать как это должно быть реализовано, то наверное и придумаешь то что сейчас есть. Но, когда я вижу что-то такое, и понимаю как оно работает, то у меня возникает эмоция: “Здорово! Правда?”

Всем хорошей рабочей недели, и ролик в тему:

blog comments powered by Disqus

Обо мне

MVP

Data Architect at Intapp, Inc.

PASS Regional Mentor, CEE

MCT, MCITP, MCPD, MCTS


Microsoft MVP

Month List