搜尋本站文章

2008-10-05

升級 SQL Server,效能變差



最近開始陸續有朋友開始進行升級作業,將 SQL Server 7.0、2000版本,升級到 SQL Server 2005、2008 版本上。但卻發覺執行並沒有提昇,甚至變得更差。

一般來講,可能是少作兩項作業所造成的原因。在此提醒各位,將資料庫升級到 SQL Server 2005、2008 版本後,請務必執行以下兩項作業:

(1)更新統計資料 - 若要協助最佳化查詢效能,我們建議您在升級之後,更新所有資料庫的統計資料。請使用 sp_updatestats 預存程序來更新 SQL Server 資料庫中使用者定義資料表的統計資料。
(2)更新使用方式計數器 - 在舊版 SQL Server 中,資料表和索引資料列計數與頁面計數的值可能會變成不正確。若要更正任何無效的資料列或頁面計數,我們建議您在升級後,針對所有資料庫執行 DBCC UPDATEUSAGE。


範例程式如下:

/*
sp_updatestats
更新統計資料 - 若要協助最佳化查詢效能,我們建議您在升級之後,更新所有資料庫的統計資料。
請使用 sp_updatestats 預存程序來更新 SQL Server 資料庫中使用者定義資料表的統計資料。

針對目前資料庫中的所有使用者自訂資料表和內部資料表來執行 UPDATE STATISTICS。
*/
--01 更新 AdventureWorks 資料庫中之資料表的統計資料。
USE Northwind;
GO
EXEC sp_updatestats 

--02 對每一個資料庫執行 sp_updatestats 作業
USE master
GO
EXEC sp_MSforeachdb @command1="print '?' EXEC [?].dbo.sp_updatestats"

/*
DBCC UPDATEUSAGE 
更新使用方式計數器 - 在舊版 SQL Server 中,資料表和索引資料列計數與頁面計數的值可能會變成不正確。
若要更正任何無效的資料列或頁面計數,我們建議您在升級後,針對所有資料庫執行 DBCC UPDATEUSAGE。

報告和更正目錄檢視中不準確的頁面和資料列計數。這些不準確可能會使 sp_spaceused 系統預存程序傳回不正確的空間使用方式報表。
在 SQL Server 2005 和更新版本中,永遠會正確維護這些值。從 SQL Server 2000 升級的資料庫可能會包含無效的計數。
我們建議您在升級之後執行 DBCC UPDATEUSAGE,以便更正任何無效的計數。
*/
--01 更新目前資料庫中之所有物件的頁面及 (或) 資料列計數
USE Northwind
DBCC UPDATEUSAGE (0);
GO

--02 對每一個資料庫執行 DBCC UPDATEUSAGE 作業
USE master
GO
EXEC sp_MSforeachdb @command1="print '?' DBCC UPDATEUSAGE (?)"


站在使用者的角度來看,相信大家都期待 SQL Server 開發團隊能夠更貼心的設計出更好用的升級功能、工具。例如:
1. 自動提醒 IT 人員,必須要更新更新統計資料、更新使用方式計數器等兩項系統資料。
2. 在升級後,提供選項讓 IT 人員,可以選擇立刻更新這兩項系統資料,或是排程更新之。




參考文件:

如何:升級到 SQL Server 2008 (安裝程式)
http://msdn.microsoft.com/zh-tw/library/ms144267.aspx




若是升級 SQL Server後,效能變差,
依據不同的情境整理,請參考以下的建議:


(一)若是為同一台伺服器執行升級作業

建議的作法是:
(1) 執行 sp_updatestats
(2) 執行 DBCC UPDATEUSAGE

(3) 重建索引(Rebuild Index)


(二)若是移轉到新的伺服器上的移轉升級作業

建議的作法是:
(1) 執行 sp_updatestats
(2) 執行 DBCC UPDATEUSAGE

(3) 重建索引(Rebuild Index)

經過評估分析後:
(4) 停用「超執行緒(HT,Hyper-Threading)」。
(5) 設定 max degree of parallelism 選項;「平行處理原則的最大程度」。


參考資料:

認識平行(parallelism)處理,以MAXDOP、cost threshold for parallelism與max degree of parallelism選項為例
http://sharedderrick.blogspot.com/2009/12/parallelismmaxdopcost-threshold-for.html

在 SQL Server 上,是否該停用「超執行緒(HT,Hyper-Threading」?
http://sharedderrick.blogspot.com/2010/11/sql-server-hthyper-threading.html