我们有一个Web应用程序,允许客户端管理大型名称列表。为了搜索这些列表,我们使用SQL Server 2008的FTS,它通常运行良好。我们最大的客户拥有900,000个名字,并且享有亚秒级的搜索时间。
然而,对于另一个新客户,我最近导入了150,000个名字,而且表现非常糟糕(如同服务器 - 令人衰弱的可怕)。我检查了全文索引器,它声称最近完成了爬行。
查看执行计划,我注意到在快速的情况下(对于较大的客户端),SQL Server首先执行FTS,然后对结果进行索引搜索。对于较新的客户端,它首先进行索引搜索(显然是新记录的150,000次),然后是FTS。
所以我尝试了WITH(INDEX(MyFullTextIndex))提示,但是SQL Server说索引不存在。显然它并不认为这些FTS索引是“真正的”索引。如何强制SQL Server始终首先使用FTS?
更新:我尝试重新生成统计数据,但无济于事。相同的性能问题。
以下是执行计划:
答案 0 :(得分:1)
我尝试在查询结束时添加“OPTIMIZE VALUE FOR UNKNOWN”提示(我还必须在查询中添加一个虚拟变量,以便在提示中引用某些内容)。到目前为止,似乎工作得很好。我对添加提示感到有些紧张,所以我仍然在寻找更好的解决方案,但现在这仍然有效。
答案 1 :(得分:0)
检查每张桌子的统计数据。这两个服务器可能具有不同的统计信息集,因为SQL会根据您的设置自动生成统计信息。如果它创建了不同的统计信息,它将为查询选择不同的查询计划。
然后,确保您的统计信息已更新。有关更新每个表的统计信息的信息,请参阅联机丛书:
http://msdn.microsoft.com/en-us/library/ms187348.aspx
我会使用fullscan进行更新,以确保您获得良好的数据。
最后,如果这些都不起作用,请在SQL Server Management Studio中运行查询,但使用“包含实际查询计划”选项。然后右键单击查询计划中的任意位置,并选择“另存为XML”。在网络上的某个地方发布两个不同的查询计划,我们将看看有什么区别和原因。
答案 2 :(得分:0)
不确定这会有所帮助,但您可以尝试使用CONTAINSTABLE - 这可以让您更改连接顺序。
SELECT customer_id FROM 客户 在哪里 包含(客户名称, 'Foobar的')
变为
SELECT customer_id FROM 客户 AS FTTABLE INNER 加入 CONTAINSTABLE (客户,客户名称,'Foobar')FTINDEX ON FTINDEX。[Key] = FTTABLE.customer_id
答案 3 :(得分:0)
我从未使用过SQL Server的FTS服务,但是就像第一张海报所说的那样,我发现在加载数据仓库或报告数据库时,某些运行良好的查询在加载大量数据后运行速度非常慢。每次加载后运行sp_updatestats都会解决问题(即使选中了自动更新统计数据库选项(默认情况下也是如此)。
答案 4 :(得分:0)
FTS索引是一个黑盒子,sql server只能连接它的结果集,它总是搜索整个表,而不管where子句或内连接。我发现提高FT搜索性能的一种方法是在模式绑定视图中执行连接和任何非参数where子句,并在该视图上搜索全文索引。