Будет ли индексирование улучшать производительность запросов 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, индекс может ускорить выполнение запросов.
Однако, если вы сделаете много обновлений, индекс может повредить вашу производительность, поэтому вам нужно знать, с какими запросами будет работать ваша БД, прежде чем принимать это решение.