Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server全文搜索-大型查询_C#_Sql Server_Entity Framework_Full Text Search_Large Query - Fatal编程技术网

C# SQL Server全文搜索-大型查询

C# SQL Server全文搜索-大型查询,c#,sql-server,entity-framework,full-text-search,large-query,C#,Sql Server,Entity Framework,Full Text Search,Large Query,我正在用C编写一个应用程序,使用SQL Server 2014中的全文搜索查询。用户需要能够使用包含多达100000个参数的非常大的查询来搜索数据库。例如: FTS查询: SELECT * FROM Client WHERE contains(Name, '"John" OR "Sarah"') 类似查询: SELECT * FROM Client WHERE Name in ('John', 'Sarah') 除了两个名字之外,我们有10万个名字。显然,这超过了SQL支持的最大查询长度。

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

FTS查询:

SELECT * FROM Client WHERE contains(Name, '"John" OR "Sarah"') 
类似查询:

SELECT * FROM Client WHERE Name in ('John', 'Sarah')
除了两个名字之外,我们有10万个名字。显然,这超过了SQL支持的最大查询长度。该数据库包含超过100万条记录。在某些情况下,我需要找到以指定字符串开头的客户机名称,这就是为什么FTS优于In或like子句的原因。除了将请求批处理成多个块之外,还有什么聪明的方法可以绕过它吗?除了使用SQL数据库,还有更好的选择吗


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

使用纯SQL时,我建议使用sp_executesql。这允许您传入多达2100个参数,每个参数对应一个名称。SQL Server将能够为该查询重新使用查询计划—无需重新编译—因此速度很快

通过创建2100个名称的批次,您需要48个批次;这方面的延迟应该相当低。另外,如果使用多个连接,则可以并行启动它们

考虑快照隔离或“带NOLOCK”以防止数据重新加载期间出现延迟


最后,请确保设置了正确的索引,并使用SQL Profiler检查实际的查询计划,以验证情况是否属实。

为什么不提取数据表中的所有数据并搜索数据表行中的数据轮询?1KK记录选择不应带到mutch执行。然后按行搜索键。ItemarrayIt’在查询中插入这么多参数通常是个坏主意,这样做会损坏磁盘、tempdb和内存,并导致数百万不必要的读写,还可能导致服务器上的数据库碎片化。为什么不能使用联接将客户机表连接到名称表?我可能误解了?@Richard没有名字表。我正在搜索的客户端名称来自用户输入。我可以创建一个临时表来存储它们,但FTS不能将表列作为搜索参数。@Legion这可能比批处理请求要好一些,我想我会尝试一下,看看它会产生多少内存开销。谢谢@Andrzej确定如何:为名称创建一个永久表,如Name[nvarchar],[SearchInstance UNIQUEIDENTIFIER],在执行搜索时,生成一个Guid,将所有名称插入带有Guid的名称表中。然后使用Guid将客户端表连接到Names表,其中Names.SearchInstance=@Guid。首先有效地将所有参数添加到一个单独的表中,然后连接到该表以生成结果?如果您认为不需要执行多个FTS搜索查询,那么很高兴在完整的答案中解释这一点?与查询中不同,contains查询将所有搜索参数作为一个不能超过8000个字符的字符串接收。我假定您的语句的结构如下:从客户端选择*,其中@p1、@P2中的名称语句的长度可以是2GB,请参阅