提高 Full-Text 查询的性能

下面是有助于提高全文查询性能的建议列表。

全文查询的性能也受硬件资源(如内存、磁盘速度、CPU 速度和计算机体系结构)的影响。

  • 使用 ALTER INDEX REORGANIZE 对基表的索引进行碎片整理。

  • 使用 ALTER FULLTEXT CATALOG REORGANIZE 重新组织全文目录。 请确保在进行性能测试之前执行这项操作,因为执行该语句会导致该目录中的全文索引进行主合并。

  • 将所选全文键列限制为小列。 尽管支持 900 字节列,但我们建议在全文索引中使用较小的键列。 intbigint 提供最佳性能。

  • 使用整数全文键可避免与 docid 映射表建立联接。 因此,整数全文键按数量级顺序提高查询性能,并提高爬网性能。 如果全文键也是聚集索引键,则可能会带来附加的性能优势。

  • 将多个 CONTAINS 谓词合并为一个 CONTAINS 谓词。 在 SQL Server 中,可以在 CONTAINS 查询中指定列的列表。

  • 如果只需要全文键或排名信息,请分别使用 CONTAINSTABLEFREETEXTTABLE 而不是 CONTAINS 或 FREETEXT。

  • 若要限制结果并提高性能,请使用 FREETEXTTABLE 和 CONTAINSTABLE 函数 top_n_by_rank 参数。 top_n_by_rank 仅允许你检索最相关的结果。 仅当业务方案不需要召回所有可能的命中(即不需要 总召回率)时,才使用此参数。

    注释

    法律方案通常需要总召回率,但对于业务方案(如电子商务)来说,总召回率可能比性能要低。

  • 检查全文查询计划,确保选择了适当的联接计划。 如果需要,请使用联接提示或查询提示。 如果在全文查询中使用参数,则参数的第一次值将确定查询计划。 可以使用 OPTIMIZE FOR 查询提示,使查询以您所需的值进行编译。 这有助于实现确定性的查询计划和更好的性能。

  • 全文索引中的全文索引片段过多,可能会导致查询性能大幅下降。 若要减少片段数,请使用 ALTER FULLTEXT CATALOGTransact-SQL 语句的 REORGANIZE 选项重新组织全文目录。 此语句实质上将所有片段合并到单个较大的片段中,并从全文索引中删除所有过时的条目。

  • 在全文搜索中,CONTAINSTABLE(AND、OR)中指定的逻辑运算符既可以通过 SQL 联接来实现,也可以在全文执行流处理的表值函数(STVF)中实现。 通常,只有一种类型的逻辑运算符的查询纯粹是通过全文执行来实现的,而混合逻辑运算符的查询也拥有 SQL 联接。 在全文执行 STVF 中实现逻辑运算符使用一些特殊的索引属性,使它比 SQL 联接快得多。 出于此原因,我们建议尽可能只使用单个类型的逻辑运算符来帧查询。

  • 对于包含选择性关系谓词的应用程序,使用选择性关系谓词和未选择全文谓词的查询在写入以使用查询优化器时可能表现最佳。 这样,查询优化器就可以确定它是否可以利用谓词或范围下推来生成有效的查询计划。 与将关系数据作为全文数据编制索引相比,这种方法更简单且效率更高。

SQL Server 2008 Full-Text 搜索:内部机制和增强功能

另请参阅

sys.dm_fts_memory_buffers(Transact-SQL)
sys.dm_fts_memory_pools(Transact-SQL)