提高全文查询的性能

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

以下推荐列表可以帮助您提升全文查询的性能。

硬件资源如内存、磁盘速度、CPU速度和机器架构都会影响全文查询的性能。

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

  • 使用 ALTER FULLTEXT CATALOG REORGANIZE 重新组织全文目录。 过多的全文索引片段会导致查询性能的显著下降。 该语句将所有片段合并为一个更大的索引片段,移除所有陈旧的事件信息。 确保在性能测试前运行此语句,因为运行此语句会导致该目录中全文索引的主合并。

  • 将全文键列的选择限制在较小的列上。 虽然支持900字节列,但在全文索引中使用较小的键列。 int 和 bigint 可提供最佳性能。

  • 使用整数全文键可以避免与 docid 映射表的连接,从而提升查询和爬取性能。 如果全文键同时也是聚类索引键,性能还能进一步提升。

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

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

  • 要限制结果并提高性能,请使用 FREETEXTTABLE 和 CONTAINSTABLE 函数的 top_n_by_rank 参数。 top_n_by_rank 允许你只召回最相关的结果。 仅当您的业务场景不需要召回所有可能的命中结果(即不要求 完全召回)时,才使用此参数。

    注意

    在法律场景中,通常需要尽可能高的召回率,但在电子商务等商业场景中,召回率的重要性可能不如性能。

  • 检查全文查询计划以确保选择了适当的联接计划。 如果必须这样做,可使用联接提示或查询提示。 如果全文查询中使用了参数,则该参数的第一时间值决定查询计划。 你可以用 OPTIMIZE FOR查询提示 强制查询编译成你想要的值。 这有助于实现确定性查询计划和更好的性能。

  • 在全文搜索中,中 CONTAINSTABLE (AND, OR) 指定的逻辑运算符可以作为 Transact-SQL 连接实现,也可以在全文执行流表值函数(STVF)中实现。 通常,仅有一种逻辑运算符的查询通过全文执行实现,而混合逻辑运算符的查询也包含SQL连接。 全文执行 STVF 内的逻辑运算符在实现时使用了一些特殊索引属性,使它比 SQL 联接速度快得多。 因此,尽可能只使用单一类型的逻辑运算子来构建查询。

  • 对于包含选择性关系谓词的应用程序,使用选择性关系谓词和非选择性全文谓词的查询,在使用查询优化器时表现可能最佳。 这种方法允许查询优化器决定是否可以利用谓词或范围下推来制定有效的查询计划。 与将关系数据作为全文数据建立索引相比,此方法更简单,通常也更有效。

SQL Server 2008 全文搜索:内部机制与增强功能