Этот вопрос охватывает то, что мне интересно, но ответы на него не совсем точны.
Может показаться, что в целом «=» быстрее, чем «нравится» при использовании подстановочных знаков. Похоже, это общепринятое мнение. Однако давайте предположим, что у меня есть столбец, содержащий ограниченное количество различных фиксированных, жестко запрограммированных идентификаторов varchar, и я хочу выбрать все строки, соответствующие одному из них:
select * from table where value like 'abc%'
и
select * from table where value = 'abcdefghijklmn'
'Like' должно проверять только первые три символа, чтобы найти совпадение, тогда как '=' должен сравнивать всю строку. В этом случае мне кажется, что подобное имело бы преимущество при прочих равных условиях.
Это общий академический вопрос, поэтому он не имеет значения, какая БД возникла при использовании SQL Server 2005.
источник
value
- индексируется или нет . Если это так, то=
это простой поиск без необходимости сканирования таблицы, и он избавит вас от любогоLIKE
утверждения, которое вы ему бросите.LIKE
с подстановочным знаком в конце является SARGable и, таким образом, будет выполнять поиск диапазона по индексу, без просмотра таблицы. Этот поиск диапазона может довольно легко конкурировать с=
оператором, и во многих случаях (например, если все удовлетворяющие строки находятся на одной странице, что немаловажно) может иметь точно такую же производительность, что влечет за собой одинаковое количество чтений.Ответы:
См. Https://web.archive.org/web/20150209022016/http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx
Цитата оттуда:
источник
Это ощутимая разница.
Выполните следующее:
Create Table #TempTester (id int, col1 varchar(20), value varchar(20)) go INSERT INTO #TempTester (id, col1, value) VALUES (1, 'this is #1', 'abcdefghij') GO INSERT INTO #TempTester (id, col1, value) VALUES (2, 'this is #2', 'foob'), (3, 'this is #3', 'abdefghic'), (4, 'this is #4', 'other'), (5, 'this is #5', 'zyx'), (6, 'this is #6', 'zyx'), (7, 'this is #7', 'zyx'), (8, 'this is #8', 'klm'), (9, 'this is #9', 'klm'), (10, 'this is #10', 'zyx') GO 10000 CREATE CLUSTERED INDEX ixId ON #TempTester(id)CREATE CLUSTERED INDEX ixId ON #TempTester(id) CREATE NONCLUSTERED INDEX ixTesting ON #TempTester(value)
Потом:
SET SHOWPLAN_XML ON
Потом:
SELECT * FROM #TempTester WHERE value LIKE 'abc%' SELECT * FROM #TempTester WHERE value = 'abcdefghij'
Полученный план выполнения показывает, что стоимость первой операции
LIKE
сравнения примерно в 10 раз дороже, чем=
сравнение.Если вы можете использовать
=
сравнение, сделайте это.источник
19.95
поэтому SQL Server требует дополнительных 19 ключевых поисков, которые никогда не материализуются в действительности (даже в фактическом плане выполнения показанные затраты основаны на оценочной стоимости поддерева)LIKE
, 203 мс для=
. Я ожидаю, что если я проведу больше тестов и получу точные средние значения, реальной разницы между #temp и реальной таблицей не будет.Вы также должны иметь в виду, что при использовании
like
некоторые разновидности sql будут игнорировать индексы, и это снизит производительность. Это особенно верно, если вы не используете шаблон «начинается с», как в вашем примере.Вам действительно стоит взглянуть на план выполнения запроса и посмотреть, что он делает, стараясь угадывать как можно меньше.
При этом шаблон «начинается с» может быть оптимизирован в sql server. Он будет использовать индекс таблицы. EF 4.0 перешел
like
на именноStartsWith
по этой причине.источник
Если
value
неиндексировано, оба результата приводят к сканированию таблицы. Разница в производительности в этом сценарии будет незначительной.Если
value
он проиндексирован, как указывает Даниэль в своем комментарии,=
результатом будет поиск индекса, который имеет производительность O (log N). КАК будет (скорее всего - в зависимости от того, как оно селективного) в результате частичного сканирования индекса>= 'abc'
и< 'abd'
который потребует больше усилий , чем=
.Обратите внимание, что я говорю здесь о SQL Server - не всем СУБД понравится LIKE.
источник
=
case, иlike '...%'
case ведут себя одинаково, если sql распознает шаблон (и это так), потому что в обоих случаях поддеревья выбираются на основе отношений сравнения.'abd'
достигнута.Вы задаете неправильный вопрос. В базах данных имеет значение не производительность оператора, это всегда SARGability выражения и покрываемость всего запроса. Производительность самого оператора во многом не имеет значения.
Итак, как сделать
LIKE
и=
сравнить с точки зрения SARGability?LIKE
, при использовании с выражением, которое не начинается с константы (например, при использованииLIKE '%something'
), по определению не относится к SARGabale. Но делает ли это возможным=
илиLIKE 'something%'
надежным? Нет. Как и на любой вопрос о производительности SQL, ответ заключается не в запросе текста, а в развернутой схеме. Эти выражения могут быть SARGable, если для них существует индекс.Так что, по правде говоря, есть небольшие различия между
=
иLIKE
. Но спросить, является ли тот или иной оператор «быстрее» в SQL, все равно что спросить: «Что идет быстрее, красная машина или синяя машина?». Вам следует задавать вопросы о размере двигателя и весе автомобиля, а не о цвете ... Чтобы подойти к вопросам об оптимизации реляционных таблиц, вам следует искать свои индексы и выражения в предложении WHERE (и других предложениях, но обычно это начинается с ГДЕ).источник
Личный пример с использованием mysql 5.5: у меня было внутреннее соединение между двумя таблицами, одной из 3 миллионов строк и одной из 10 тысяч строк.
При использовании лайка для индекса, как показано ниже (без подстановочных знаков), это заняло около 30 секунд:
используя "объяснить", я получаю:
При использовании '=' в том же запросе потребовалось около 0,1 секунды:
Используя «объяснить», я получаю:
Как видите,
like
поиск по индексу полностью отменен, поэтому запрос занял в 300 раз больше времени.источник
Возможно, вы ищете полнотекстовый поиск .
источник
Перво-наперво,
они не всегда равны
select 'Hello' from dual where 'Hello ' like 'Hello'; select 'Hello' from dual where 'Hello ' = 'Hello';
когда вещи не всегда равны, говорить об их производительности не так актуально.
Если вы работаете со строками и только с символьными переменными, можно говорить о производительности. Но не используйте подобные и "=" как взаимозаменяемые.
Как вы могли видеть во многих сообщениях (выше и в других вопросах), в случаях, когда они равны, производительность лайка ниже из-за сопоставления с образцом (сопоставления)
источник
'Hello '
этоVARCHAR
(по умолчанию), вы правы, но если этоCHAR
- нет. Преобразуйте его в a,CHAR(7)
и оба вернут true. Кроме того, что, черт возьми, вы делаете, когда не используетеTRIM
свои варчары? (примечание: это, по крайней мере, так вSQL Server 2008r2
)