如何通过SqlServer全文搜索避免超时?

时间:2010-08-26 19:24:12

标签: linq-to-sql sql-server-2008 full-text-search

我们正在使用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

关于问题可能是什么的任何想法?

3 个答案:

答案 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索引在一段时间不活动后被卸载。让他们保持新鲜感的后台工作解决了这个问题。