Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Linq to sql 如何使用SqlServer全文搜索避免超时?_Linq To Sql_Sql Server 2008_Full Text Search - Fatal编程技术网

Linq to sql 如何使用SqlServer全文搜索避免超时?

Linq to sql 如何使用SqlServer全文搜索避免超时?,linq-to-sql,sql-server-2008,full-text-search,Linq To Sql,Sql Server 2008,Full Text Search,我们正在使用SQLServer2008。在SSMS中,第一次对全文目录的查询可能需要2-5秒,但在这之后,返回速度相当快 另一方面,通过Linq2Sql从运行查询将超时 以下是我们所拥有的: SQL内联表UDF CREATE FUNCTION dbo.SearchArchiveFTS ( @query nvarchar(255) ) RETURNS @ret TABLE ( ID NVarChar(12) NOT NULL,

我们正在使用SQLServer2008。在SSMS中,第一次对全文目录的查询可能需要2-5秒,但在这之后,返回速度相当快

另一方面,通过Linq2Sql从运行查询将超时

以下是我们所拥有的:

SQL内联表UDF

CREATE FUNCTION dbo.SearchArchiveFTS
(   
    @query nvarchar(255)
)
RETURNS @ret TABLE 
(
            ID      NVarChar(12) NOT NULL,
            snapshotDate    DateTime NOT NULL,
            -- about 10 more
)
AS BEGIN
    declare @innerQuery nvarchar(255)
    set @innerQuery = @query
    insert into @ret
    select      ID,
                snapshotDate,
                -- about 10 more
        from dbo.Archive a
        where contains(a.*, @innerQuery)
    return
SSMS中的查询

select * from dbo.SearchArchiveFTS('query')
//3 seconds / 3k rows
在Linq2Sql中查询

db.SearchArchiveFTS("query").ToArray();
// timeout exception

有什么问题吗?

检查您的连接是否在
arithabort关闭时进入。在SSMS中,它处于启用状态

你可以像这样轻松地检查

select arithabort,* 
from sys.dm_exec_sessions
where is_user_process =1
只需找到击中DB的SPID

您还尝试查看在SSMS中执行此操作时会发生什么

SET ARITHABORT OFF 
select * from dbo.SearchArchiveFTS('query')
现在需要更长的时间吗

也有可能你从LINQ那里得到了一个糟糕的计划

通过运行以下命令,可以清除过程缓存和内存缓冲区

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

请注意,它将删除服务器上的所有计划,SQL server将不得不重新创建所有这些计划,并再次从磁盘读取所有数据……

我同意@sqlnemage,当某些东西在SSMS中运行得很快,而不是从应用程序中运行时,这通常是连接差异

但是,为什么要使用函数来实现这样的功能呢

如果必须使用函数,为什么不使用如下表值函数:

CREATE FUNCTION dbo.SearchArchiveFTS
(   
    @query nvarchar(255)
)
RETURNS TABLE 
AS RETURN
(
    select      ID,
                snapshotDate,
                -- about 10 more
        from dbo.Archive a
        where contains(a.*, @query)
);

这个问题似乎与SQL Server的一个功能有关,在SQL Server中,FTS索引在一段时间不活动后卸载。让他们保持新鲜的后台工作解决了这个问题。

这就是我所拥有的,但我认为SSMS可能存在参数嗅探问题-我在设置ARITHABORT OFF和on时得到相同的结果,而从Linq,ARITHABORT设置为0