SQL Server полнотекстовый поиск - большой запрос
Я пишу приложение на C# с использованием запросов полнотекстового поиска в SQL Server 2014. Пользователь должен иметь возможность поиска в базе данных, используя очень большой запрос, содержащий до 100 000 параметров. Например:
FTS Query:
SELECT * FROM Client WHERE contains(Name, '"John" OR "Sarah"')
НРАВИТСЯ запрос:
SELECT * FROM Client WHERE Name in ('John', 'Sarah')
За исключением 2 имен, у нас есть 100 000 имен. Очевидно, это превышает максимальную длину запроса, поддерживаемую SQL. База данных содержит чуть более 1 миллиона записей. В некоторых случаях мне нужно будет найти имена клиентов, начинающиеся с указанной строки, поэтому FTS предпочтительнее, чем предложения "in" или "like". Есть ли какой-нибудь умный способ обойти это, кроме пакетирования запросов на множество кусков? Есть ли лучшая альтернатива использованию базы данных SQL?
Я также пытался реализовать поиск с помощью Lucene.NET, но создание индекса для более 1 миллиона записей занимает много часов, что недопустимо, поскольку данные будут синхронизироваться ежедневно.
1 ответ
При использовании простого SQL я предлагаю использовать sp_executesql. Это позволяет передавать до 2100 параметров, по одному для каждого имени. SQL Server сможет повторно использовать план запроса для этого запроса - перекомпиляция не требуется - так что это быстро.
Создавая партии из 2100 имен, вам нужно 48 партий; задержка для этого должна быть достаточно низкой. Кроме того, вы можете запустить их параллельно, если вы используете несколько соединений.
Рассмотрите изоляцию моментального снимка или "С NOLOCK", чтобы предотвратить задержки во время перезагрузки данных.
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server
https://www.mssqltips.com/sqlservertip/2470/understanding-the-sql-server-nolock-hint/
Наконец, убедитесь, что вы установили правильные индексы и используете SQL Profiler, чтобы проверить фактические планы запросов, чтобы убедиться, что это так.