性能优化(全文搜索)

更新日期: 2006 年 4 月 14 日

硬件资源(如内存、磁盘速度和 CPU 速度)会影响全文索引和全文查询的性能。

全文索引性能

导致全文索引性能降低的主要原因是硬件资源的限制:

  • 如果由 MSFTESQL 服务和 SQL Server 所占用的 CPU 使用率接近百分之百,则 CPU 成为瓶颈。
  • 如果平均磁盘等待队列长度多于磁盘头数量的两倍,则磁盘成为瓶颈。主要的解决方法是创建独立于 SQL Server 数据库文件和日志的全文目录。将日志、数据库文件和全文目录分别放在不同的磁盘上。购买运行速度更快的磁盘和使用 RAID 也能帮助改善索引性能。
  • 如果缺少物理内存(3 GB 限制)并且爬网日志中出现服务暂停消息,则内存成为瓶颈。有关如何解决此问题的信息,请参阅 Microsoft SQL Server 全文引擎 (MSFTESQL) 服务已暂停。MSFTESQL 服务不支持 AWE。添加多于 4 GB 的内存仅帮助 SQL Server。

如果系统中没有观察到瓶颈,您可以优化系统使硬件容量最大化。没有硬件瓶颈时,Microsoft SQL Server 2005 中全文搜索的索引性能主要取决于:

  • SQL Server 创建全文批花费的时间。
  • MSFTESQL 服务使用这些批的速度。

若要达到最佳性能,必须优化 SQL Server 与 MSFTESQL 服务之间的交互。如果 MSFTESQL 服务处理不完 SQL Server 生成的批,该服务将暂停,并生成一个爬网日志消息来指示此暂停状态。有关如何解决此问题的信息,请参阅 Microsoft SQL Server 全文引擎 (MSFTESQL) 服务已暂停

另一方面,如果 SQL Server 没有生成足够的全文批使 MSFTESQL 服务充分运行,该服务就会闲置。此状态不是最佳性能。事实上,这是索引运行缓慢的最常见的原因。若要确保 MSFTESQL 服务处于最佳使用状况,必须跟踪并优化下列计数器:

  • 正在处理的批计数器:Microsoft Full-Text Engine Filter Daemon (MSFTELFD)
    此计数器的计数应当等于系统中的 CPU 数或产该数的两倍。当 CPU 使用值为 0、1 或 2 时,指示 SQL Server 执行情况不好。例如,如果计算机上具有 4 个 CPU,则此数值就应该为 4 或 8。
  • 已就绪的批队列:MSFTESQL 服务

该值应接近爬网范围计数的 10 倍。若要确定为索引表格使用了多少个范围,请从 sys.dm_fts_population_ranges 运行一个查询。

如果计数器的计数偏低,可用下列方法改善它:

  • 确保该表有多爬网范围。若要验证,请查询 sys.dm_fts_population_ranges。理想状况是,爬网范围计数是 CPU 个数的两倍。爬网范围受制于表中的行数、CPU 的个数和 max full-text crawl range 配置选项限制。为使选项生效,必须重新启动爬网操作。
    ms142560.note(zh-cn,SQL.90).gif注意:
    此计数器仅适用于全文爬网。
  • 请确保基表具有聚集索引。对聚集索引的第一列使用整数数据类型。避免在聚集索引的第一列使用 GUID。聚集索引上的多范围爬网能产生最高的爬网速度。
  • 使用 UPDATE STATISTICS 语句更新基表的统计信息。更重要的是,更新聚集索引的统计信息或全文爬网的全文键。这有助于多爬网范围在表上生成良好的分区。
  • 如果您想改善增量填充的性能,则可在时间戳列上生成一个二级索引。
ms142560.note(zh-cn,SQL.90).gif注意:
与全文爬网不同,增量、手动和自动更改跟踪填充的设计目的并不是为了最大化硬件资源以获得更高的速度。因此,这些优化建议可能不会增强全文索引的性能。

提高全文查询性能的建议

下面列出了有助于提高全文查询性能的建议:

  • 使用 ALTER INDEX REORGANIZE 对基表的索引进行碎片整理。
  • 使用 ALTER FULLTEXT CATALOG REORGANIZE 重新组织全文目录。请务必在性能测试之前执行此操作,因为它会导致该目录中全文索引的主合并。
  • 仅选择较小的列作为全文键列。即使支持 900 字节的列,我们也不建议您使用这么大的键列来创建全文索引。
  • 将多个 CONTAINS 谓词合并为一个 CONTAINS 谓词。在 SQL Server 中,您可以在 CONTAINS 查询中指定一个包含若干列的列表。
  • 如果只需要全文键或排名的信息,请分别使用 CONTAINSTABLEFREETEXTTABLE,而不要使用 CONTAINS 或 FREETEXT。
  • 若要限制结果数并提高性能,请使用 FREETEXTTABLE 和 CONTAINSTABLE 语法的 TOP_N_BY_RANK 选项。如果您不是对可能查询到的所有信息都感兴趣,可使用此选项。
  • 检查全文查询计划以确保选择了适当的联接计划。若有必要,可使用一个联接提示或查询提示。如果全文查询中使用了参数,则该参数的第一时间值决定查询计划。可使用 OPTIMIZE FOR 查询提示来强制使用所需值编写查询。这有助于获得确定性查询和更好的性能。

请参阅

概念

管理全文搜索

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

版本 历史记录

2006 年 4 月 14 日

已更改的内容:
  • 对性能优化建议做了重大修改。