4

我正在使用 SQL Server 2014 中的全文搜索查询在 C# 中编写应用程序。用户需要能够使用包含多达 100 000 个参数的非常大的查询来搜索数据库。例如:

FTS 查询:

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

LIKE 查询:

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

除了 2 个名字,我们有 100 000 个名字。显然,这超出了 SQL 支持的最大查询长度。该数据库包含超过 100 万条记录。在某些情况下,我需要查找以指定字符串开头的客户端名称,这就是 FTS 优于“in”或“like”子句的原因。除了将请求批处理成许多块之外,是否有一些巧妙的绕过方法?有没有比使用 SQL 数据库更好的选择?

我也尝试使用 Lucene.NET 实现搜索,但是为超过 100 万条记录生成索引需要很多小时,这是不可接受的,因为数据将每天同步。

4

1 回答 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

考虑快照隔离或“无锁”以防止数据重新加载期间的延迟。

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 检查实际的查询计划以验证情况是否如此。

于 2019-05-07T14:45:37.857 回答