Есть ли эффективный способ индексации внутри слов в SQL Server 2008? - PullRequest
0 голосов
/ 18 ноября 2009

У нас есть несколько запросов в нашей системе, которые используют LIKE "%" + @ SomeCriteria + "%" для поиска имени человека. В данном случае речь идет о полях VARCHAR (50). Мы действительно хотели бы предоставить нашим пользователям возможность поиска по именам.

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

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

Ответы [ 4 ]

3 голосов
/ 18 ноября 2009

Что ж, использование Полнотекстового поиска поможет (EDIT: см. Комментарии ниже, NOT будет работать для суффиксов / среднесрочных поисков), но может быть излишним для ваш сценарий (или нет). Индексирование очень мало поможет, как вы уже упомянули, хотя, как уже упоминал @Aaron, оно несколько улучшилось в 2k5 (только другой способ помог бы, если бы у вас был покрытый некластеризованный индекс, который будет сканироваться по сравнению с кластером, что только помощь, если некластеризованный индекс был на самом деле меньше в необработанном размере, то есть меньше данных для сканирования).

Возможным пользовательским решением будет создание вычисляемого столбца из столбца символов, который вы ищете и сохраняете / индексируете это, но это действительно будет возможно / полезно, если вы будете искать заданную позицию или компонент строки (например, если вы ищете что-то наподобие поля электронной почты, вы можете создать вычисляемый столбец, который сопоставляет / материализует шаблон только с частью домена адреса электронной почты, затем сохраняет / индексирует это и вместо этого запрашивает там).

2 голосов
/ 18 ноября 2009

Однажды мы помогли с медлительностью запроса: у нас был сохраненный процесс, который выполнял два фрагмента кода вместо одного. Сначала мы выполняли поиск точного соответствия, а затем переходили к неточному поиску только в том случае, если точный поиск не дал результатов (или в одном случае, если поиск точного соответствия дал менее 5 результатов). Таким образом, пользователи, которые хотели ввести полное имя, получили быстрый ответ, а те, кто хотел набрать всего несколько символов, получили более медленный. Вы также можете сделать это с тремя вариантами: точное совпадение, неточное совпадение только в конце и неточное совпадение в начале и конце.

1 голос
/ 18 ноября 2009

Это было улучшено в SQL Server 2005, но это не то, над чем у вас есть прямой контроль ...

http://technet.microsoft.com/en-us/library/cc966419.aspx#XSLTsection131121120120

0 голосов
/ 18 ноября 2009

Раньше я пользовался большим успехом, используя Soundex . У меня было требование, чтобы американцы искали похожие фамилии в Восточной Европе, например, Elanov / Ilanov / Yllanov будет иметь аналогичные подписи Soundex.

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