SQL Server; индекс по столбцу ТЕКСТ - PullRequest
7 голосов
/ 06 мая 2009

У меня есть таблица базы данных с несколькими столбцами; большинство из них являются столбцами типа VARCHAR(x), и некоторые из этих столбцов имеют индекс, так что я могу быстро искать данные внутри него.

Однако один из столбцов - это столбец TEXT, поскольку он содержит очень большой объем данных (23 КБ простого текста в формате ascii и т. Д.). Я хочу иметь возможность искать в этом столбце (... WHERE col1 LIKE '%search string%'...), но в настоящее время выполнение запроса занимает вечность. Я знаю, что запрос медленный из-за этого поиска в столбце, потому что, когда я удаляю этот критерий из предложения WHERE, запрос завершается (что я хотел бы рассмотреть) мгновенно.

Я не могу добавить индекс для этого столбца, поскольку этот параметр недоступен для этого столбца в мастере / мастере создания индексов в SQL Server Management Studio.

Какие у меня есть варианты, чтобы ускорить поиск в этом столбце?

Спасибо за ваше время ...

Обновление
Итак, я посмотрел в полнотекстовый поиск и сделал все это, и теперь я хотел бы выполнять запросы. Тем не менее, при использовании «содержит», он принимает только одно слово; что если мне нужна точная фраза? ... WHERE CONTAINS (col1, 'search phrase') ... выдает ошибку.

Извините, я новичок в SQL Server

Обновление 2 извини, просто разобрался; использовать несколько предложений «содержит» вместо одного предложения с несколькими словами. На самом деле, это все еще не дает того, что я хочу (точная фраза), а только обеспечивает присутствие всех слов в фразе.

Ответы [ 5 ]

10 голосов
/ 06 мая 2009

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

4 голосов
/ 06 мая 2009

Если ваши запросы похожи на LIKE '%string%' (т. Е. Вы ищете строку внутри a TEXT поля), тогда вам потребуется индекс FULLTEXT.

Если вы ищете подстроку в начале поля (LIKE 'string%') и используете SQL Server 2005 или выше, то вы можете преобразовать TEXT в VARCHAR(MAX), создать вычисляем столбец и индексируем этот столбец.

См. Эту статью в моем блоге для деталей производительности:

4 голосов
/ 06 мая 2009

Вы должны использовать полнотекстовое индексирование столбца.

0 голосов
/ 15 мая 2014

И так как никто еще не сказал (возможно, потому что это очевидно), запрос LIKE '%string%' обходит ваши существующие индексы - поэтому он будет работать медленно. Отсюда - почему нужно использовать полнотекстовое индексирование. (это то, что сказал Кассной).

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

0 голосов
/ 06 мая 2009

Вы можете выполнять сложные логические запросы в FTS; как

содержит (yourcol, '"Мой первый укус" или "моя вторая строка" и "моя третья строка"')

В зависимости от вашего запроса, ContainsTable или freetexttable могут дать лучшие результаты.

Если вы подключаетесь через .Net, вы можете посмотреть Полнотекстовый поиск Google

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