Sql-Server

啟用 SQL Server 全文索引後更新查詢變慢

  • October 13, 2017

我有一個 asp.net 網站,其中包含許多針對我的數據庫執行的插入、更新和刪除查詢。

幾天前,我在其中一個表的兩列上創建了全文索引。之後,我意識到當網站對該表執行更新查詢時,SQL Server 程序的記憶體和磁碟使用量正在跳躍,更新速度較慢。在創建全文索引之前,查詢執行沒有任何性能問題。

我還意識到以前非常簡單的更新查詢現在變得複雜了,因為執行計劃現在有諸如全文索引更新之類的東西。這是啟用全文後變得複雜的新執行計劃的一部分:

在此處輸入圖像描述

在我更新站點內容的幾個小時內,我執行了 5000 個更新查詢,並且我認為每次對每一行都完成全文索引過程。

我應該在更新行開始時禁用全文掃描然後重新啟用它(如在這個相關問題中)?

我可以告訴 SQL Server 停止全文索引 5 分鐘,然後開始索引新數據嗎?

有沒有更好的選擇?我正在使用 SQL Server 2012。

就我而言,我不得不更改效率低下的 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 秒。問題是我曾經更新所有行,即使它們已經具有我想要分配的值。

如果您停止它(禁用它),索引將無法用於使用它的查詢。

但是,您可以將更改跟踪設置為手動:

--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 傳播到全文索引。數據更改通過WRITETEXT並且UPDATETEXT不反映在全文索引中,並且不會通過更改跟踪獲取。

請參閱ALTER FULLTEXT INDEX (Transact-SQL)的 Microsoft 文件。

引用自:https://dba.stackexchange.com/questions/112081