我有一个运行基于Sql Server 2012网络版的电子商务商店的网站。数据库越来越少4GB,它包含大约20,000个项目。 此数据库配置为“简单”,并包含大小为15MB的全文目录。
每当我启动网站并尝试搜索时,使用FTS的存储过程会在30秒后耗尽时间。对于以下2-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
该部分创建一个临时表,用于插入响应查询文本的ProductIds。
答案 0 :(得分:0)
您观察到的行为很可能是因为FTS过程引用的一个或多个表中缺少索引。如果缺少索引,Sql Server将在第一次调用相关存储过程时构建自己的内部索引,因此您将获得初始延迟。为避免这种延迟,您需要自己创建缺失的索引。
请按照以下步骤操作:
注意,我说的是缺少普通/普通的非聚集表索引而不是FTS索引/目录。
PS。对于延迟回复感到抱歉,但我自己正在搜索FTS性能问题,所以刚刚找到了你未回答的问题。虽然我的问题与缺失索引无关。