Sql Server 2012全文搜索 - 初始查询响应缓慢

时间:2013-09-11 13:11:14

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

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

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

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

我真的无法理解那是什么因为我搜索时:

  1. 网站显然已启动,因此进程正在运行且已配置AppPool
  2. 数据库应该打开,因为在第一页上有一些产品从数据库中获取(如果它们不在缓存中)。我认为缓存并没有被使用,因为相同的服务器被越来越少的其他10个电子商务网站使用。
  3. 在1-5次查询之后,一切都顺利进行了一段时间
  4. 任何人都有一些想法吗?

    以下是代码摘录。

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

      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. 该部分创建一个临时表,用于插入响应查询文本的ProductIds。

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

1 个答案:

答案 0 :(得分:0)

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

请按照以下步骤操作:

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

    PS。对于延迟回复感到抱歉,但我自己正在搜索FTS性能问题,所以刚刚找到了你未回答的问题。虽然我的问题与缺失索引无关。