Linq to sql 如何使用SqlServer全文搜索避免超时?
我们正在使用SQLServer2008。在SSMS中,第一次对全文目录的查询可能需要2-5秒,但在这之后,返回速度相当快 另一方面,通过Linq2Sql从运行查询将超时 以下是我们所拥有的: SQL内联表UDFLinq 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,
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