какой SQL-запрос является лучшим - PullRequest
0 голосов
/ 10 апреля 2019

Мне нужна функция поиска в моем приложении, каков наилучший способ сделать это в SQL Server?

  1. Создать запрос с 1 большим предложением where, содержащим все столбцы, используяОператор OR и создание 1 индекса, содержащего все столбцы
SELECT *
FROM Customer
WHERE CustomerNumber LIKE '%' + @SearchValue +'%'
OR LastName LIKE '%' + @SearchValue +'%'
OR FirstName LIKE '%' + @SearchValue +'%'
OR
Создание отдельных запросов для каждого столбца с использованием UNION и создание индекса для каждого столбца
SELECT * 
FROM Customer 
WHERE CustomerNumber LIKE '%' + @SearchValue +'%'
UNION 
SELECT * 
FROM Customer
WHERE LastName LIKE '%' + @SearchValue +'%'
UNION
SELECT * 
FROM Customer
WHERE FirstName LIKE '%' + @SearchValue +'%'

Я читал, что индексы не поддерживают оператор OR?Таким образом, решение 2 является единственным правильным?

Для некоторых из вас это может показаться очень простым вопросом, но я пытаюсь понять «почему», мне нужно это сделать, поэтому любая справочная информация всегда приветствуется..

Ответы [ 4 ]

3 голосов
/ 10 апреля 2019

Ни один не является оптимальным, но первый немного лучше. Он сканирует данные только один раз, и оценка like замыкается на предмет совпадения с первым или вторым условием. Кроме того, union потребует дополнительных затрат на удаление дубликатов.

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

1 голос
/ 10 апреля 2019

Как правило, для любого rdb условия OR не могут быть оптимизированы;Индексы пропуска AFAIK реализуются большинством RDB, что означает возможность оптимизации условий нескольких диапазонов.Однако в вашем случае, поскольку ваши условия LIKE начинаются с % и, таким образом, не соответствуют префиксам, они не могут быть оптимизированы по индексам, поскольку они не являются условиями диапазона.Тем не менее, вы должны использовать композицию OR: она легче читается, верно для цели запроса, и очень вероятно, что запрос UNION выполнит многократное сканирование таблицы, по одному для каждого подзапроса, в то время как запрос ORскорее всего, сделает одно сканирование, которое должно быть быстрее.Я говорю «вероятно», потому что с идеальным оптимизатором запросов все эквивалентные запросы должны быть разрешены в соответствии с наилучшим планом выполнения - в данном случае, одним сканированием.Но оптимизаторы далеки от «идеала».Поэтому, работая с различными YMMV для rdb, следуйте запросу OR.

С таким запросом, однако, если вы ищете слова, вам следует рассмотреть возможность использования полнотекстовых индексов, если они доступны, и они доступныв большинстве rdbs, но с разными синтаксисами запросов.https://www.mssqltips.com/sqlservertutorial/9136/sql-server-full-text-indexes/

0 голосов
/ 10 апреля 2019

Не беспокойтесь об индексах.

Ни один из этих запросов не будет использовать какой-либо индекс.В любом случае они будут выполнять полное сканирование таблицы, поскольку шаблоны поиска начинаются с %.

. Первый выполняет одно полное сканирование таблицы, а второй - три.Поэтому первый будет быстрее.

Также имейте в виду, что второй запрос вернет немного другой набор результатов, поскольку удаляет дубликаты.

0 голосов
/ 10 апреля 2019

Оба запроса не обеспечивают оптимальной производительности.

для варианта 1 - или сканирует много возможностей, и это не лучший способ сделать это ... у вас должна быть индексация строк, чтобы объединить все параметры вместе.

опции 2 - это медленнее, чем первая опция, так как она делает множественные опции выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...