启用 SQL Server 全文索引后更新查询速度变慢

Moh*_* Ha 10 performance sql-server full-text-search sql-server-2012 query-performance

我有一个 asp.net 网站,其中有许多针对我的数据库运行的插入、更新和删除查询。

几天前,我在其中一个表的两列上创建了一个全文索引。之后我意识到当网站在该表上运行更新查询时,SQL Server 进程的内存和磁盘使用量正在跳跃并且更新速度较慢。在创建全文索引之前,查询运行没有任何性能问题。

我也意识到以前非常简单的更新查询现在变得复杂了,因为执行计划现在有诸如全文索引更新之类的东西。这是启用全文后变得复杂的新执行计划的一部分:

在此处输入图片说明

在我更新站点内容的几个小时内,我运行了 5000 个更新查询,我认为每次都为每一行完成全文索引过程。

我应该在更新行开始时禁用全文扫描,然后重新启用它(如在这个相关问题中)?

我可以告诉 SQL Server 停止全文索引 5 分钟,然后开始索引新数据吗?

有没有更好的选择?我正在使用 SQL Server 2012。

Jul*_*eur 2

如果您停止它(禁用它),索引将不可用于使用它的查询。

但是,您可以将更改跟踪设置为手动:

--disable automatic change tracking
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING MANUAL
GO

--run the update statement here

--re-enable automatical change tracking after updating it to reflect the recent changes
ALTER FULLTEXT INDEX schema.table START UPDATE POPULATION
GO
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING AUTO
GO
Run Code Online (Sandbox Code Playgroud)

您可以使用以下查询检查当前值:

SELECT TOP(10) change_tracking_state_desc, * 
FROM sys.fulltext_indexes 
WHERE object_name(object_id) = '...';
Run Code Online (Sandbox Code Playgroud)

有效选项有:SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

指定对全文索引所覆盖的表列所做的更改(更新、删除或插入)是否将由 SQL Server 传播到全文索引。数据更改WRITETEXT不会UPDATETEXT反映在全文索引中,也不会通过更改跟踪来获取。

请参阅有关ALTER FULLTEXT INDEX (Transact-SQL)的 Microsoft 文档。