0

我有一个基于 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 未包含在临时表中的项目
4

1 回答 1

0

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

按着这些次序:

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

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

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

于 2016-09-23T14:59:43.030 回答