SQL Server как поведение оператора для %% - PullRequest
2 голосов
/ 17 сентября 2010

С точки зрения производительности, как действует оператор like при применении к строкам с несколькими заполнителями%?

, например:

select A from table_A where A like 'A%' 

занимает то же время, чтобы выбрать

select A from table_A where A like 'A%%' 

???

Ответы [ 3 ]

8 голосов
/ 17 сентября 2010

Ваши запросы:

select A from table_A where A like 'A%' 

и

select A from table_A where A like 'A%%'
                                      ^ optimizer will remove second redundant %

эквивалентны, оптимизатор удалит второй % во втором запросе

так же, как этоудалит 1=1 из:

select A from table_A where A like 'A%%' and 1=1

Однако этот запрос сильно отличается:

select A from table_A where A like '%A%' 

При использовании 'A%' будет использоваться индекс, чтобы найти все, начиная сA, как человек, использующий телефонную книгу, быстро ищет начало имени.Однако при использовании '%A%' он будет сканировать всю таблицу в поисках чего-либо, содержащего A, таким образом медленнее и без использования индекса.Например, если бы вам нужно было найти каждое имя в телефонной книге, содержащее букву «А», это заняло бы некоторое время!

1 голос
/ 17 сентября 2010

Это будет относиться к ним так же. Если в столбце A есть индекс, он будет использовать этот индекс так же, как и с одним подстановочным знаком. Однако, если вы добавите лидирующий подстановочный знак, это приведет к сканированию таблицы независимо от того, существует индекс или нет.

0 голосов
/ 17 сентября 2010

По большей части используемый вами шаблон не повлияет на производительность запроса.Ключом к производительности для этого является правильное использование индексов.В вашем примере индекс столбца будет работать хорошо, поскольку он будет искать значения, которые начинаются с «A», а затем соответствуют полному шаблону.Вокруг может быть несколько более сложных шаблонов, но разница в производительности между ними незначительна.

Есть одно важное условие, когда подстановочный знак ухудшает производительность.И это когда это в начале паттерна.Например, «% A» не получит выгоды от индекса, поскольку он указывает, что вы хотите сопоставить любое значение, начинающееся с любого допустимого символа.Все строки должны быть оценены для соответствия этим критериям.

...