4

我们有一个 Web 应用程序,允许客户管理大量名称列表。为了在这些列表中进行搜索,我们使用 SQL Server 2008 的 FTS,它通常运行良好。我们最大的客户拥有 900,000 个姓名,并享有亚秒级的搜索时间。

然而,对于另一个新客户端,我最近导入了 150,000 个名称,性能很糟糕(例如,服务器非常糟糕)。我检查了全文索引器,它声称最近完成了一次爬网。

查看执行计划,我注意到在快速情况下(对于较大的客户端),SQL Server 首先执行 FTS,然后对结果执行索引搜索。对于较新的客户端,它首先进行索引搜索(显然,对于新记录,150,000 次),然后进行 FTS。

所以我尝试了 WITH(INDEX(MyFullTextIndex)) 提示,但 SQL Server 说索引不存在。显然,它不认为这些 FTS 索引是“真正的”索引。如何强制 SQL Server 始终首先使用 FTS?

更新:我尝试重新生成统计信息,但无济于事。同样的性能问题。

以下是执行计划:

快速性能: http: //frameaction.com/LLExecutionPlan01.sqlplan

性能缓慢:http: //frameaction.com/LLExecutionPlan18.sqlplan

4

5 回答 5

1

我尝试在查询末尾添加“优化未知值”提示(我还必须在查询中添加一个虚拟变量以在提示中引用一些内容)。到目前为止,它似乎运行良好。我对添加提示有点紧张,所以我仍在寻找更好的解决方案,但现在这正在工作。

于 2009-01-29T00:22:40.557 回答
0

我从来没有使用过 SQL Server 的 FTS 服务,但是就像第一个发帖人所说的那样,我发现在加载数据仓库或报告数据库时,某些运行良好的查询在加载大量数据后运行速度非常慢。在每次加载后运行 sp_updatestats 解决了问题(即使选中了自动更新统计信息数据库选项(默认情况下)。

于 2009-02-03T04:06:36.993 回答
0

不确定这会有所帮助,但您可以尝试使用 CONTAINSTABLE - 它可以让您更改加入顺序。

SELECT customer_id FROM customers WHERE CONTAINS (customername, 'Foobar')

变成

客户中选择 customer_id作为 FTTABLE INNER JOIN CONTAINSTABLE(客户,客户名称,'Foobar')FTINDEX ON FTINDEX.[Key] = FTTABLE.customer_id

于 2009-01-28T01:07:49.810 回答
0

检查每个表的统计信息。两台服务器可能有不同的统计数据集,因为 SQL 会根据您的设置自动生成统计数据。如果它创建了不同的统计信息,它将为查询选择不同的查询计划。

然后,确保您的统计信息已更新。在线图书中提供了有关更新每个表的统计信息的信息:

http://msdn.microsoft.com/en-us/library/ms187348.aspx

我会使用全扫描进行更新,以确保您获得良好的数据。

最后,如果这些都不起作用,请在 SQL Server Management Studio 中运行查询,但使用“包含实际查询计划”选项。然后右键单击查询计划上的任意位置并选择另存为 XML。将这两个不同的查询计划发布在网络上的某个地方,我们将看看有什么区别以及原因。

于 2009-01-27T21:13:11.627 回答
0

FTS 索引是一个黑盒,sql server 只能将其结果集加入其中,它总是搜索整个表,而不管任何 where 子句或内部连接。我发现提高 FT 搜索性能的一种方法是在模式绑定视图中执行连接和任何基于 where 子句的非参数,并在该视图上搜索全文索引。

于 2009-02-26T13:47:25.400 回答