代码之家  ›  专栏  ›  技术社区  ›  Scott Weinstein

如何避免SQLServer全文搜索超时?

  •  1
  • Scott Weinstein  · 技术社区  · 14 年前

    我们使用的是SQLServer2008。在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 回复  |  直到 14 年前
        1
  •  0
  •   SQLMenace    14 年前

    检查您的连接是否与 arithabort off . 在SSMS中,它是打开的

    你可以这样轻易地查一下

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

    找到击中数据库的SPID

    你也试着看看当你在SSMS中这样做时会发生什么。

    SET ARITHABORT OFF 
    select * from dbo.SearchArchiveFTS('query')
    

    现在需要更长时间吗?

    你也有可能从林肯那里得到一个坏计划。

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

    DBCC DROPCLEANBUFFERS
    DBCC FREEPROCCACHE
    

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

        2
  •  0
  •   KM.    14 年前

    我同意@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)
    );
    
        3
  •  0
  •   Scott Weinstein    14 年前

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