2013年9月21日 星期六

SQL Server 效能調校實戰

* 64Bit 的 Windows Server 要配上 64Bit 的 SQL Server,不然會影響效能
(例如:避免在 64bit windows server 上安裝 32bit sql server ... 就杯具了)

* 要經常注意資料的成長率
(雖然資料庫預設會自動長大,但是也會有來不及長大就掛點的危機,而且,這還很常發生)

* 效能的檢測與評估,可以分為三大部分:硬體資源配置規劃,資料庫設計,應用程式設計
(必須要對症下藥才會有效,不然可以花了錢又製造更多的災難)

* 可使用 ALTER [Table] REBUILD 來重建資料表 (瘦身)
TechNet Ref : ALTER TABLE (Transact-SQL)

* 備份起來之後大量刪除會造成大量的交易記錄(Transaction Log)
MSDN Ref : Managing the Transaction Log
(註:這邊忘了,是要先備份起來避免,還是怎樣 ... 總之每次刪除都會產生紀錄這樣)

* Do not View on View
(檢視表拿出來再做檢視表,這樣的效能一定不好)

* Table 與 Index 的 File Group 可以分開設置
(利用硬體的特性,分開存放在不同實體才有效果,放在同一顆硬碟的不同磁碟區其實並沒有意義)

* 核心處理資料時,只讀取 8k per page (要注意)

* 設計時的資料型態(DataType)規劃很重要

* 設計時的索引(Index)規劃也很重要

* 64Bit 不會檢查 AWE
TechNet Ref : 使用 AWE

* SQL Server 設定中的選項不要亂勾選
(選項之間有可能互相影響)

* 硬體會影響的部分可分為 CPU / HD / RAM / NETWORK

* File Group / Table / Index 相關

* 2 Tier / 3 Tier / SQL Command / Transaction / Lock 等都有可能影響效能

* Do not over 6 indexes in one table.
(數大不一定美)

* 使用 LIKE 比對字串,會比使用 SubString(0 ~ n) 來的快速
假使你的字串比對都是「從頭開始」,選用 SubString 不見得會變快

* 使用 SET 改變資料會比 Loop Cursor 要來得有效率

* 定期量測效能指標 :
- response time
- concurrent user
- data process per min
- cpu usage
- HD IOPS
- ram usage

* 分割 Table 與 Index 可以提升效能

* 使用資料壓縮來縮減 Table 與 Index 的大小
(跟壓縮有關的功能似乎有版本限制)

* 內建效能調校工具 :
- Database Tuning Advisor
- SQL Server Profiler

* SanpShot 會使用到 tempdb

* 設定交易隔離等級

* 利用資料分割鎖定 與 減少磁碟爭用

補充 : tempdb 資料庫的並行增強功能

* 使用資源管理員控制資源的使用量

* 使用資料收集器收集資料,並且分析與產生報表

* 資料壓縮 :
- Row 壓縮 : 適合 Online : 2% ~ 5% CPU 使用量, 20% 壓縮比
- Page 壓縮 : 適合 History : 10% ~ 15% CPU 使用量, 60% ~ 70% 壓縮比
(不只檔案縮小,連記憶體的使用量也會減少,代價是 CPU 使用率)

* 使用 Filtered Indexes (篩選索引) 可以提升索引效率
語法 : CREATE INDEX [IndexName] ON [TableName]([ColumnName]) WHERE TYPE='[TypeName]';

* 向上擴充支援 NUMA, 256 顆 CPU, 2TB RAM, 50 Instance ... 等

* 向外擴充支援 SSAS, Service Broker, Data Dependent Routing, 分割檢視表(可橫切) ... 等

* 分割檢視表中的定序很重要,計算型欄位不可以有索引,可搭配 INSTEAD OF 觸發程序

* 查詢通知可以使用系統內建的預存程序 sp_DispatcherProc

* 查詢通知在 ADO.NET 的相關元件為 : SQLNotifcation, SqlDepandency

* 資料異動擷取(CDC)
- 異動資料擷取的基本概念
- 啟用異動資料擷取
- 異動資料擷取資料表 (Transact-SQL)

* 變更追蹤(CD) ... 此處缺肉 orz

* 點對點交易式複寫有 分散查詢 + 容錯 的特性

* 可擴充共用資料庫(唯讀)

* 使用系統的效能監視器(Performance Counter)來監測伺服器的健康狀況
也可以找出"基準線",讓將來更容易分辨異常
記錄下來的數值,要注重其相對性,尤其是與之前的紀錄數據做比較
注意:這邊主要是要知道發生了什麼(WHAT),而不是為何(WHY)或是如何(HOW)

* 重要的效能物件與計數器 : ... (這邊投影片上有,我就不多打了)

* 善用 SQL Trace (server side) 與 SQL Profiler (client side)

* SQL Profiler 的死結圖示可以很直覺的看到死結的事發現場 XD

* SQL Profiler 可以整合效能監視器,同時紀錄系統效能

* Database Engine Tuning Advisor 可以由各種紀錄的來源,來分析出效能調整的建議
(這工具非常強大,不過似乎也有版本的限制 ...)

* 伺服器端的好幫手 - Management Studio
可以產生各種好用的報表,以及即時的活動監視器,用來觀察目前伺服器運行的狀況
更貼心的是,下方直接就將"最近且費時的查詢"的前幾名列出來了,黑名單就在這!!

* 動態管理檢視與動態管理函數
內建許多功能,像是可以找出 TOP 20 MAX CPU Time (in one day) 這樣的資訊


* 非同步 mirror : use 2 snapshots on mirror
(Tip : join-in tempdb)

* 正確的 DataType 是很重要的
(當你每筆資料省下了 50 Bytes,當有 4000 萬筆資料時,就省下約 2GB 的空間)

* 可以使用 VS2008 做壓力測試模擬

* 可以使用 Performance Dashboard Report 尋找 Missing Index (重要)
- SQL Server 2005 Performance Dashboard Reports Download

* DataType Matching is important.
(假使兩端資料型態不吻合,有可能影響執行計畫的流程,進而造成效能降低)

* 資料庫正規畫與 JOIN 指令,大量的 JOIN 會直接影響效能
(正規化與反正規化的取捨,要靠經驗與專案需求而定,沒有標準答案)

* 觀察 T-SQL 指令的執行計畫,進而改善查詢的效能

* 使用者自訂函數,在某些情況可以改善效能

沒有留言:

張貼留言