2011-04-28 33 views
3

我有一個名爲Person的表,其中列PersonDescription是「文本」類型。 我有更新此列的問題,所以我跑了劇本將表格列從「文本」轉換爲Varchar後的問題(最大)

ALTER TABLE dbo.Person ALTER COLUMN PersonDescription VARCHAR(最大值)

更改列是 VARCHAR(最大值)。這一切都很好,並立即運行。但是現在我已經注意到,只要我嘗試更新這個列,那麼它需要3-4分鐘才能執行。查詢

更新人所設定的PersonDescription = '人描述',其中PERSONID = 18

此更新跑那麼它立即執行後。這一切都很好,但是當這個改變進入生產階段時,這張表有100萬條記錄,所以每次登錄的人在運行時都會超時。任何人都可以告訴我如何防止這種情況。是否有另一個腳本等,我需要運行。運行更新後,我看到Statman在sqlserver上運行,這是花時間。

感謝 尼爾

+2

如果它是自動創建應該只是一個任務的統計數據。不知道如果在編譯查詢時發生超時,會發生什麼情況。該查詢看起來應該不需要'PersonDescription'列上的任何統計信息。只有在'personid' – 2011-04-28 13:50:31

+0

感謝回覆馬丁。我設法通過創建一個部署腳本來解決這個問題,該腳本爲1條記錄更新新的修改列。通過這種方式,統計信息在第一個用戶登錄到系統之前得到更新,因此不會導致任何不想要的問題。謝謝。 – Somedeveloper 2011-04-29 15:35:20

+0

我不知道這是否可能與我們在sql server中發現的錯誤有關,因爲我們在之前爲null的字段上將文本更改爲varchar(max)。 http://stackoverflow.com/questions/10295771/why-is-is-not-null-returning-null-values-for-a-varcharmax-in-sql-server。我們使用SQL來修復它,如更新人設置PersonDescription = PersonDescription – Colin 2013-01-23 14:40:07

回答

0

在我看來,這個問題是由於到SQL Server計算是否應該將數據存儲在一個BLOB或行。

參見:Using varchar(MAX) vs TEXT on SQL Server

「的VARCHAR(MAX)類型爲文本替換的基本區別在於,TEXT類型將總是將數據存儲在一個blob而VARCHAR(MAX)類型將嘗試。將數據直接存儲在行中,除非它超過了8k的限制,並且在那一刻它將它存儲在一個blob中。「

您是否還在使用全文索引?禁用索引,更新,重建索引。

您是否嘗試過創建新表並將記錄複製到它?你仍然有相同的性能問題?