我正在使用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万条记录的索引会花费很多小时,这是不可接受的,因为数据将每天同步。
答案 0 :(得分:1)
使用纯SQL时,建议使用sp_executesql。这样您最多可以传递2100个参数,每个名称一个。 SQL Server将能够为该查询重新使用查询计划-无需重新编译-因此速度很快。
通过创建2100个名称的批次,您需要48个批次;这样的等待时间应该相当低。另外,如果您使用多个连接,则可以并行启动它们。
考虑快照隔离或“ 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检查实际的查询计划以确认是这种情况。