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 партий; задержка для этого должна быть достаточно низкой. Кроме того, вы можете запустить их параллельно, если вы используете несколько соединений.

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017

Рассмотрите изоляцию моментального снимка или "С 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, чтобы проверить фактические планы запросов, чтобы убедиться, что это так.

Другие вопросы по тегам