SQL Server полнотекстовый поиск - большой запрос - PullRequest
4 голосов
/ 07 мая 2019

Я пишу приложение на C # с использованием запросов полнотекстового поиска в SQL Server 2014. Пользователь должен иметь возможность выполнять поиск в базе данных, используя очень большой запрос, содержащий до 100 000 параметров.Например:

Запрос FTS:

SELECT * FROM Client WHERE contains(Name, '"John" OR "Sarah"') 

LIKE запрос:

SELECT * FROM Client WHERE Name in ('John', 'Sarah')

За исключением двух имен, у нас есть 100 000 имен.Очевидно, это превышает максимальную длину запроса, поддерживаемую SQL.База данных содержит чуть более 1 миллиона записей.В некоторых случаях мне нужно будет найти имена клиентов, начинающиеся с указанной строки, поэтому FTS предпочтительнее, чем предложения «in» или «like».Есть ли какой-нибудь умный способ обойти это, кроме пакетирования запросов на множество кусков?Есть ли лучшая альтернатива использованию базы данных SQL?

Я также пытался реализовать поиск с использованием Lucene.NET, но создание индекса для более 1 миллиона записей занимает много часов, что недопустимо, так какданные будут синхронизироваться ежедневно.

1 Ответ

1 голос
/ 07 мая 2019

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

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