我有一个基于 Sql Server 2012 Web Edition 运行电子商务商店的网站。该数据库越来越少 4GB,它包含大约 20.000 个项目。该数据库配置为“简单”,包含一个大小为 15MB 的全文目录。
每当我启动站点并尝试搜索时,使用 FTS 的存储过程会在 30 秒后超时。对于以下 2-3 次搜索,此行为将继续存在。之后,一切顺利并检索结果。
我试图扩大托管网站的服务器,但没有任何改变。我还尝试将站点数据库托管在专用机器上,但没有发现任何改进。我尝试为全文目录配置填充计划,但似乎没有任何改变。
我真的无法理解那可能是什么,因为当我搜索时:
- 网站显然已启动,因此进程正在运行并配置了 AppPool
- 应该打开数据库,因为在第一页上有一些产品从数据库中获取(如果它们不在缓存中)。我想缓存并没有被如此使用,因为同一台服务器被越来越多的其他电子商务网站使用。
- 经过 1-5 次查询后,一段时间内一切顺利
有人有一些想法吗?
这是代码的摘录。
- 网站通过调用存储过程启动搜索。
- 存储过程需要 15 个参数。其中之一是关键字,即搜索到的文本
如果关键字不为空并且数据库上有全文目录,则存储过程在真正开始时会执行此操作:
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
该部分创建一个临时表,用于插入响应查询文本的 ProductId。
- 存储过程使用其他参数过滤产品并删除其 ID 未包含在临时表中的项目