我们正在使用SqlServer 2008.在SSMS中,对全文目录的查询可能第一次需要2-5秒,但之后会很快返回。
另一方面,从via 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
关于问题可能是什么的任何想法?
答案 0 :(得分:0)
检查您的连接是否未使用arithabort off
。在SSMS中它是ON
你可以像这样轻松查看
select arithabort,*
from sys.dm_exec_sessions
where is_user_process =1
找到正在点击数据库的SPID
您还试着看看在SSMS中执行此操作时会发生什么
SET ARITHABORT OFF
select * from dbo.SearchArchiveFTS('query')
现在需要更长的时间吗?
您也可能从LINQ
获得错误的计划您可以通过运行以下命令来清除过程缓存和内存缓冲区
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
请注意,它将消除服务器上的所有计划,SQL Server必须重新创建所有这些计划,并再次从磁盘读取所有数据.......
答案 1 :(得分:0)
我同意@SQLMenace,当某些东西在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)
);
答案 2 :(得分:0)
该问题似乎与SQL Server的一项功能有关,其中FTS索引在一段时间不活动后被卸载。让他们保持新鲜感的后台工作解决了这个问题。