Не без серьезного усилия по подготовке, hwilson1.
С риском повторения очевидного - любая оптимизация пути поиска, приводящая к решению, используется ли индекс или какой тип оператора соединения использовать и т. Д. (Независимо от того, о какой СУБД мы говорим) работает на равенство (равно) или проверку диапазона (больше и меньше).
С помощью ведущих подстановочных знаков вам не повезло.
Обходной серьезное усилие подготовки, как указано фронт:
Это свелось бы текст поиска функции Vertica, где решается эта проблема. Смотрите здесь:
https://my.vertica.com/docs/8.0.x/HTML/index.htm#Authoring/AdministratorsGuide/Tables/TextSearch/UsingTextSearch.htm
Для любой другой платформы базы данных, включая MS SQL, вы должны сделать это вручную.
В двух словах: он опирается на первичный ключ или уникальный идентификатор таблицы, текстовый поиск которой вы хотите оптимизировать.
Вы создаете вспомогательную таблицу, основным ключом которой является первичный ключ вашей базовой таблицы, а также порядковый номер и столбец VARCHAR, который будет содержать серию подстрок строки базовой таблицы, которую вы первоначально искали с использованием подстановочных знаков. В более упрощенном виде:
Если ваша входная таблица (только с указанием столбцов, которые имеют значение) заключается в следующем:
id |the_search_col |other_col
42|The Restaurant at the End of the Universe|Arthur Dent
43|The Hitch-Hiker's Guide to the Galaxy |Ford Prefect
Ваша вспомогательный поиск таблица может содержать:
id |seq|search_token
42| 1|Restaurant
42| 2|End
42| 3|Universe
43| 1|Hitch-Hiker
43| 2|Guide
43| 3|Galaxy
Обычно, вы подавлять типичные «наполнители», такие как статьи, предлоги и апострофы, и разделяться на токены, разделенные пунктуацией и пробелом. Тем не менее, для вашего примера «% nham%» вам, вероятно, нужно поговорить с лингвистом, специализирующимся на английской морфологии, чтобы найти кандидатов на маркеры разделения ....: -]
Вы можете начать с той же методики что я использую, когда я ООН-шарнирный горизонтальный ряд мер без предложения PIVOT, как здесь:
Pivot sql convert rows to columns
Затем, используя комбинацию, вероятно, вложенный, CHARINDEX() и SUBSTRING(), используя индекс вы получаете от CROSS JOIN серию индексных целых чисел, как описано в моем сообщении, предложенном выше, и используйте этот самый индекс в качестве последовательности для вспомогательной таблицы поиска.
Положите индекс на search_token
, и у вас будет очень быстрый путь доступа к большой таблице.
не прогулка в парке, я согласен, но многообещающим ...
Счастливая игра -
Marco здравомыслящий
Насколько я знаю, SQL Server не имеет встроенного типа индекса, который делает то, что вы хотите (Postgres). Есть способы делать то, что вы хотите, но они требуют большой работы. –
Вы правы в том, что индексы не смогли бы найти этого, но даже сканирование индекса с помощью ключевых поисков может быть быстрее, чем сканирование таблицы, если это то, что он делает сейчас. Тебе придется протестировать его и посмотреть. – SqlZim
Точка уточнения: вы можете искать части слов с полнотекстовыми индексами, но это должна быть первая часть слова. Используя ваш пример строки, вы можете успешно использовать полнотекстовый индекс, ища «Guil», но вы правильно говорите, что это не будет работать для «nham». – dfundako