Производительность с LIKE vs CONTAINS с использованием полнотекстового индексирования

У меня есть таблица с большим (ish) количеством строк 500k, MSSQL Server 2008. У меня есть столбец, который содержит идентификатор продукта nvarchar, который обычно имеет длину 15 символов, алфавитный и числовой, например FF93F348HJKCF5HW9. Я хотел бы иметь возможность выполнять поиск по этому идентификатору продукта с максимальной производительностью. Я провел некоторое исследование по использованию полнотекстовой индексации для этого столбца, и я действительно не думаю, что использование полнотекстовой индексации с использованием CONTAINS дает какие-либо преимущества по сравнению с использованием LIKE '%%'. Похоже, это связано с тем, что полнотекстовая индексация более полезна при поиске целых слов, а не ряда символов.

Может ли кто-нибудь подтвердить / опровергнуть это для меня?


person user989056    schedule 01.02.2012    source источник
comment
Зачем нужно искать частичные идентификаторы продукта? Я бы просто проиндексировал столбец и поискал точные совпадения или, по крайней мере, без ведущего подстановочного знака. Если вашему приложению действительно нужно искать частичные идентификаторы, сделайте это отдельной функцией и запросите не поведение по умолчанию, поскольку я предполагаю, что необходимость в этом редка.   -  person Martin Smith    schedule 01.02.2012
comment
Поиск частичных идентификаторов продуктов будет использоваться в текстовом поле «автозаполнение» в веб-интерфейсе. Ввод частичного идентификатора покажет список возможных совпадений во время ничьей.   -  person user989056    schedule 01.02.2012
comment
Таким образом, нет необходимости обслуживать ведущий подстановочный знак. Это замедлит выполнение всех запросов (требующих полного сканирования), чтобы исключить возможность удаленного ввода текста с середины. Я бы хотя бы сделал частичное совпадение флажком, который не установлен по умолчанию.   -  person Martin Smith    schedule 01.02.2012
comment
Конечно, это не проблема, но мой вопрос касается CONTAINS и LIKE, в этом случае есть ли какое-либо преимущество в производительности при использовании CONTAINS с полнотекстовым индексированием по сравнению с использованием LIKE   -  person user989056    schedule 01.02.2012
comment
Полнотекстовая индексация предназначена для поиска языковых слов - ваши данные не содержат слов, а только последовательность символов - я бы ожидал, что LIKE действительно будет быстрее (если данные проиндексированы). Обратите внимание, что contains предназначен для поиска структур, похожих на слова: msdn.microsoft.com /en-us/library/ms187787.aspx   -  person N West    schedule 01.02.2012
comment
@N West, Примерно то, что я думал, было так, отправьте как ответ, и я отмечу его как ответ.   -  person user989056    schedule 01.02.2012
comment
AFAIK FTS не будет индексировать различные подстроки ProductId, которые потребуются для того, чтобы сделать этот поиск вообще эффективным. Я полагаю, вы могли бы сделать это самостоятельно, поскольку для каждого ProductId требуется всего 15 записей.   -  person Martin Smith    schedule 01.02.2012


Ответы (1)


Полнотекстовая индексация - это поиск языковых слов в неструктурированных текстовых данных. Ваши данные не содержат слов, а просто последовательность символов.

Я не тестировал это, но ожидал, что LIKE действительно будет быстрее, если ваши данные проиндексированы. CONTAINS предназначен для поиска слов и словоподобных структур.

Если ваше требование - "автозаполнение", тогда LIKE будет работать довольно хорошо, поскольку оптимизатор будет использовать INDEX SEEK, когда вы будете искать что-то вроде LIKE 'F5521%'.

В этой статье MSDN объясняются основы ключевого слова CONTAINS.

person N West    schedule 01.02.2012