SQL Server全文搜索-大查询

时间:2019-05-07 14:24:51

标签: c# sql-server entity-framework full-text-search large-query

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

FTS查询:

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

喜欢查询:

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

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

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

1 个答案:

答案 0 :(得分: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

考虑快照隔离或“ WITH 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检查实际的查询计划以确认是这种情况。