Sql-Server
啟用 SQL Server 全文索引後更新查詢變慢
我有一個 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 文件。