SQL LIKE Производительность только с подстановочным знаком (%) в качестве значения - PullRequest
11 голосов
/ 22 октября 2009

Мне интересно, какова будет производительность запроса при использовании ключевого слова LIKE и подстановочного знака в качестве значения по сравнению с отсутствием предложения where.

Рассмотрим условие where, такое как "WHERE a LIKE '%'". Это будет соответствовать всем возможным значениям столбца «а». Как это можно сравнить с отсутствием предложения where.

Причина, по которой я спрашиваю это, состоит в том, что у меня есть приложение, в котором есть некоторые поля, в которых пользователь может указывать значения для поиска. В некоторых случаях пользователю хотелось бы получить все возможные результаты. В настоящее время я использую один запрос, подобный этому:

SELECT * FROM TableName WHERE a LIKE ? AND b LIKE ?

Можно указать значения «%» и «%», чтобы соответствовать всем возможным значениям для a и или b. Это удобно, поскольку для этого я могу использовать один именованный запрос в своем приложении. Интересно, каковы соображения производительности для этого. Уменьшает ли оптимизатор запросов значение LIKE '%', чтобы оно просто соответствовало всем? Я понимаю, что, поскольку я использую именованный запрос (подготовленное утверждение), это также может повлиять на ответ. Я понимаю, что ответ, скорее всего, зависит от конкретной базы данных. В частности, как это будет работать в Oracle, MS SQL Server и Derby.

Альтернативный подход к этому состоит в использовании 3 отдельных запросов, основанных на вводе пользователем символа подстановки.

A - шаблонный запрос:

SELECT * FROM TableName WHERE b LIKE ?

B - шаблонный запрос:

SELECT * FROM TableName WHERE a LIKE ?

A и B являются подстановочными знаками:

SELECT * FROM TableName

Нет подстановочных знаков:

SELECT * FROM TableName WHERE a LIKE ? AND b LIKE ?

Очевидно, что один запрос является самым простым и простым в обслуживании. Я бы предпочел использовать только один запрос, если производительность все еще будет хорошей.

Ответы [ 11 ]

0 голосов
/ 22 октября 2009

Что если столбец имеет ненулевое пустое значение? Ваш запрос, вероятно, будет соответствовать этому.

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

Простое утверждение if если (A B) искать б еще (A) искать еще Б поиск б еще сказать пользователю, что он ничего не указал

тривиален в обслуживании и становится намного проще для понимания, чем делать предположения об операторе LIKE. Вы, вероятно, все равно будете делать это в пользовательском интерфейсе, когда будете отображать результаты "Ваш поиск A найден x" или "Ваш поиск A B найден ..."

...