【问题标题】:Sql Server 2012 Full Text Search - Slow response on initial queriesSql Server 2012 全文搜索 - 初始查询响应缓慢
【发布时间】:2013-09-11 13:11:13
【问题描述】:

我有一个基于 Sql Server 2012 Web Edition 运行电子商务商店的网站。该数据库越来越少 4GB,它包含大约 20.000 个项目。 此数据库配置为“简单”,包含一个大小为 15MB 的全文目录。

每当我启动站点并尝试搜索时,使用 FTS 的存储过程会在 30 秒后超时。对于以下 2-3 次搜索,此行为将继续存在。之后,一切顺利,检索结果。

我尝试扩展托管网站的服务器,但没有任何改变。我还尝试将站点数据库托管在专用机器上,但没有发现任何改进。我尝试为全文目录配置填充计划,但似乎没有任何改变。

我真的不明白那是什么,因为当我搜索时:

  1. 网站显然已启动,因此进程正在运行,AppPool 已配置
  2. 应该打开数据库,因为在第一页有一些产品从数据库中获取(如果它们不在缓存中)。我想缓存并没有被如此使用,因为同一台服务器被越来越多的其他电子商务网站使用。
  3. 经过 1-5 次查询后,一段时间内一切顺利

有人有什么想法吗?

这是代码的摘录。

  1. 网站通过调用存储过程启动搜索。
  2. 存储过程需要 15 个参数。其中之一是作为搜索文本的关键字
  3. 如果关键字不为空并且数据库上有全文目录,这就是存储过程在真正开始时所做的事情:

    CREATE TABLE #ProductFullTextSearch ([ProductID] int NOT NULL)  
    SET @Keywords = isnull(@Keywords, '""')
    IF(@Keywords = '') SET @Keywords = '""'
    IF (@Keywords <> '""')
    BEGIN
    IF(@SearchExact = 1) 
    SET @Keywords = '"*' + @Keywords +'*"'
    ELSE 
    SET @Keywords = '"*' + REPLACE(@Keywords, ' ', '*" AND "*') +'*"'
    PRINT @Keywords
    
    INSERT INTO #ProductFullTextSearch(ProductID)
    SELECT p.ProductID
    FROM Nop_Product p with (NOLOCK) 
    LEFT OUTER JOIN Nop_ProductVariant pv with (NOLOCK) ON p.ProductID = pv.ProductID
    WHERE 
    p.Deleted = 0 AND ((CONTAINS((p.name), @Keywords))
    or (@SearchDescriptions = 1 and CONTAINS((p.ShortDescription, p.FullDescription), @Keywords))
    )
    
    INSERT INTO #ProductFullTextSearch(ProductID)
    SELECT p.ProductID
    FROM Nop_Product p with (NOLOCK) 
    LEFT OUTER JOIN Nop_ProductVariant pv with (NOLOCK) ON p.ProductID = pv.ProductID
    WHERE 
    p.Deleted = 0 AND ((CONTAINS((pv.name, pv.SKU), @Keywords))
    or (@SearchDescriptions = 1 and CONTAINS(pv.Description, @Keywords))
    )
    END
    
  4. 该部分创建一个临时表,用于插入响应查询文本的 ProductId。

  5. 存储过程使用其他参数过滤产品并删除其 ID 未包含在临时表中的项目

【问题讨论】:

  • 尝试为一两个查询发布一些代码,以便我们了解您的搜索方式。
  • 检查并发连接的最大池大小
  • 这是你的问题吗:support.microsoft.com/kb/915850
  • @user814064:我真的不认为这是问题所在。我没有运行 Sql Server 2005 并且有 100% 的网络连接。您是否认为 Sql Server 2012 也会受到同样问题的困扰?
  • @user1102001:你说在我的 asp.net 应用程序上?

标签: asp.net sql-server full-text-search


【解决方案1】:

您观察到的行为很可能是因为 FTS 过程引用的一个或多个表中缺少索引。如果缺少索引,Sql Server 将在第一次调用相关存储过程时构建它自己的内部索引,因此您会得到初始延迟。为避免这种延迟,您需要自己创建缺失的索引。

按照以下步骤操作:

  1. 运行 SQL Server Profiler 并使用最初由您的应用程序运行的参数捕获准确的存储过程文本。
  2. 在 SQL Server Management Studio 中连接到您的数据库,按包含实际执行计划按钮并手动运行您的查询。
  3. 在“结果”窗口中切换到“执行计划”选项卡,查看服务器是否报告了任何缺失的索引。
  4. 如果缺少索引而不是复制索引描述并在数据库中永久创建它。

注意,我说的是缺少普通/普通非聚集表索引,而不是 FTS 索引/目录。

PS。很抱歉延迟回复,但我自己也遇到了 FTS 搜索性能问题,所以刚刚找到您未回答的问题。虽然我的问题与缺少索引无关。

【讨论】:

  • 谢谢。我无法检查,因为该网站目前已死,但我会记住这一点!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2014-12-15
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多