2010-08-26 74 views
1

我们使用的是SqlServer 2008.在SSMS中,全文目录中的查询可能需要2-5秒才能完成,但在此之后,返回的速度会非常快。如何避免使用SqlServer全文搜索超时?

另一方面,从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

问题似乎与到SQL Server,其中FTS索引一段时间后卸载的功能不活动。保持新鲜的背景工作解决了问题。

0

检查您的连接是否与arithabort off不符。在SSMS是ON

,你可以很容易地检查这样

select arithabort,* 
from sys.dm_exec_sessions 
where is_user_process =1 

只是发现被打的DB

你也尝尝看,当你在SSMS

做了什么情况的SPID
SET ARITHABORT OFF 
select * from dbo.SearchArchiveFTS('query') 

现在是否需要更长时间?

它也有可能是你从LINQ

得到一个不错的计划

您可以通过运行以下命令清理过程高速缓存和内存缓冲区

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

要知道,它会清除在服务器上的所有计划和SQL Server将不得不重新创建所有这些,并再次从磁盘读取所有数据.......

+0

从SSMS-我得到了相同的结果与SET ARITHABORT OFF和ON – 2010-08-26 20:04:02

+0

和Linq,ARITHABORT设置为0 – 2010-08-26 20:12:23

0

我同意@SQLMenace,当某些东西在SSMS中快速运行时但不是来自应用程序,它是usua lly一个连接差异。

但是,为什么使用这样的功能的功能?

,如果你必须使用一个功能,为什么不使用一个表值函数是这样的:

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) 
); 
+0

这就是我所拥有的,但我虽然可能有一个参数嗅探问题 – 2010-08-26 19:44:37

相关问题