Sql server 如何优化SQL Server全文搜索
我想使用fulltextsearch来实现自动完成服务,这意味着我需要它快速工作!最多两秒 搜索结果来自不同的表,因此我创建了一个视图将它们连接在一起。 我使用的SQL函数是FREETEXTTABLE() 查询运行非常缓慢,有时长达40秒 为了优化查询执行时间,我确保基表有一个整型数据类型(而不是GUID)的聚集索引列 我有两个问题: 首先,关于如何使全文搜索更快,还有什么其他想法吗?(不包括升级硬件…) 第二,为什么每次重建全文目录后,搜索查询都会运行得非常快(不到1秒),但只运行第一次。我第二次运行查询时,需要几秒钟的时间,从那里开始,一切都很顺利。。。。知道为什么会发生这种情况吗?查看。然而,如果你真的想提高性能,你必须考虑升级你的硬件。(通过将数据和全文索引文件移动到单独的读优化磁盘,以及将日志和tempdb移动到单独的写优化磁盘,我看到了显著的性能提高——总共增加了4个磁盘,另外还有1个用于OS和SQL Server二进制文件。) 我推荐一些其他非硬件解决方案:Sql server 如何优化SQL Server全文搜索,sql-server,full-text-search,freetexttable,Sql Server,Full Text Search,Freetexttable,我想使用fulltextsearch来实现自动完成服务,这意味着我需要它快速工作!最多两秒 搜索结果来自不同的表,因此我创建了一个视图将它们连接在一起。 我使用的SQL函数是FREETEXTTABLE() 查询运行非常缓慢,有时长达40秒 为了优化查询执行时间,我确保基表有一个整型数据类型(而不是GUID)的聚集索引列 我有两个问题: 首先,关于如何使全文搜索更快,还有什么其他想法吗?(不包括升级硬件…) 第二,为什么每次重建全文目录后,搜索查询都会运行得非常快(不到1秒),但只运行第一次。我第
然而,这些本身都不可能是您正在寻找的加快速度的银弹解决方案。我怀疑这里可能还有其他因素(可能是服务器性能差、网络延迟、服务器上的资源争用……)尤其是因为您说过,每次执行全文搜索都会变慢,这与我的经验相反。重建目录后第一次查询速度非常快的原因可能很简单: 删除目录并重建它时,必须重建索引,这需要一些时间。如果您在重建完成之前进行查询,他们的查询速度会更快,原因很简单,因为数据更少。您还应该注意,查询结果包含的行更少 因此,只有在索引重建完成后,测试查询速度才有意义 下面的选择可能有助于检查索引的大小(以及碎片)。当大小停止增长时,索引的重建完成;)
你能为你的视图发布代码吗?全文索引是零碎的吗?也许这会有帮助:
-- Compute fragmentation information for all full-text indexes on the database
SELECT c.fulltext_catalog_id, c.name AS fulltext_catalog_name, i.change_tracking_state,
i.object_id, OBJECT_SCHEMA_NAME(i.object_id) + '.' + OBJECT_NAME(i.object_id) AS object_name,
f.num_fragments, f.fulltext_mb, f.largest_fragment_mb,
100.0 * (f.fulltext_mb - f.largest_fragment_mb) / NULLIF(f.fulltext_mb, 0) AS fulltext_fragmentation_in_percent
FROM sys.fulltext_catalogs c
JOIN sys.fulltext_indexes i
ON i.fulltext_catalog_id = c.fulltext_catalog_id
JOIN (
-- Compute fragment data for each table with a full-text index
SELECT table_id,
COUNT(*) AS num_fragments,
CONVERT(DECIMAL(9,2), SUM(data_size/(1024.*1024.))) AS fulltext_mb,
CONVERT(DECIMAL(9,2), MAX(data_size/(1024.*1024.))) AS largest_fragment_mb
FROM sys.fulltext_index_fragments
GROUP BY table_id
) f
ON f.table_id = i.object_id