Будет ли индексирование улучшать производительность запросов varchar (max) и как создать индекс

Во-первых, я должен указать, что у меня мало знаний об индексах SQL Server.

Моя ситуация в том, что у меня есть таблица базы данных SQL Server 2008 с столбцом varchar (max), обычно заполненным большим количеством текста.

В моем веб-приложении ASP.NET есть средство поиска, которое запрашивает этот столбец для поиска по ключевым словам, и в зависимости от количества ключевых слов, которые искали их, может быть одно или несколько операторов LIKE%% keyword% в запросе SQL для выполнения поиск.

Мое веб-приложение также позволяет искать и другие столбцы в этой таблице, а не только один столбец. Существует также несколько объединений из других таблиц.

Мой вопрос: стоит ли создавать индекс в этом столбце для повышения производительности этих поисковых запросов? И если да, то какой тип индекса и просто индексирование одного столбца будет достаточно или мне нужно включить другие столбцы, такие как первичный ключ и другие столбцы, доступные для поиска?

Ответ 1

Не стоит создавать регулярные индексы, если вы выполняете LIKE "% ключевое слово%". Причина в том, что индексирование работает как поиск в словаре, где вы начинаете с середины, а затем разделяете разницу, пока не найдете слово. Этот шаблонный запрос похож на запрос поиска слова, содержащего текст "to" или something--, и единственный способ найти совпадения - это просмотреть весь словарь.

Однако вы можете рассмотреть полнотекстовый поиск, который предназначен для такого сценария (см. Здесь).

Ответ 2

Лучшая аналогия, которую я когда-либо видел, почему индекс не поможет '%wildcard%' поискам:

Возьмите двух человек. Направляйте каждую ту же телефонную книгу. Скажите человеку слева от вас:

Расскажите, сколько людей в этой телефонной книге с фамилией "Смит".

Теперь скажите человеку справа:

Расскажите, сколько людей в этой телефонной книге с именем "Саймон".

Индекс похож на телефонную книгу. Очень легко искать вещь, которая находится в начале. Очень сложно отсканировать предмет, который находится посередине или в конце.

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

Ответ 3

вы не можете создать индекс в поле varchar (max). Максимальное количество байтов по индексу - 900. Если столбец больше 900 байт, вы можете создать индекс, но любая вставка с более чем 900 байтами не удастся.

Предлагаю вам прочитать полный текст. Он должен соответствовать вам в этом случае

Ответ 4

Лучший способ узнать - создать кучу тестовых запросов, которые напоминают то, что произойдет в реальной жизни, и попытаться запустить их против вашей БД с индексом и без него. Однако, в целом, если вы выполняете множество запросов SELECT и небольшие запросы UPDATE/DELETE, индекс может ускорить выполнение запросов.

Однако, если вы сделаете много обновлений, индекс может повредить вашу производительность, поэтому вам нужно знать, с какими запросами будет работать ваша БД, прежде чем принимать это решение.