启用S​​QL Server全文索引后更新查询的速度变慢


10

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

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

我还意识到以前非常简单的更新查询现在变得很复杂,因为执行计划现在具有全文索引更新之类的功能。这是新的执行计划的一部分,该计划在启用全文本后变得很复杂:

在此处输入图片说明

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

我应该在开始更新行时禁用全文本扫描,然后重新启用它(如此相关问题所示)吗?

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

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

Answers:


2

就我而言,我不得不更改一个效率低下的UPDATE语句:

之前:

UPDATE Customer 
SET Rating = 'Not Rated'
WHERE ...

后:

UPDATE Customer
SET Rating = 'Not Rated'
WHERE ...
AND Rating <> 'Not Rated' -- THIS LINE WAS INSERTED

将性能从4分钟降低到5秒。问题是我曾经更新所有行,即使它们已经具有我要分配的值。


1

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

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

--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

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

SELECT TOP(10) change_tracking_state_desc, * 
FROM sys.fulltext_indexes 
WHERE object_name(object_id) = '...';

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

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

请参阅Microsoft文档ALTER FULLTEXT INDEX(Transact-SQL)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.