近期因工作需要,希望比較全面的總結下SQL Server數據庫性能優化相關的注意事項,在網上搜索了 一下,發現很多文章,有的都列出了上百條,但是仔細看發現,有很多似是而非或者過時(可能對SQL SERVER6.5以前的版本或者ORACLE是適用的)的信息,只好自己根據以前的經驗和測試結果進行總結了。
我始終認為,一個系統的性能的提高,不單單是試運行或者維護階段的性能調優的任務,也不單 單是開發階段的事情,而是在整個軟件生命周期都需要注意,進行有效工作才能達到的。所以我希望按照 軟件生命周期的不同階段來總結數據庫性能優化相關的注意事項。
一、分析階段
一般來說 ,在系統分析階段往往有太多需要關注的地方,系統各種功能性、可用性、可靠性、安全性需求往往吸引 了我們大部分的注意力,但是,我們必須注意,性能是很重要的非功能性需求,必須根據系統的特點確定 其實時性需求、響應時間的需求、硬件的配置等。最好能有各種需求的量化的指標。
另一方面, 在分析階段應該根據各種需求區分出系統的類型,大的方面,區分是OLTP(聯機事務處理系統)和OLAP(聯 機分析處理系統)。
二、設計階段
設計階段可以說是以後系統性能的關鍵階段,在這個階 段,有一個關系到以後幾乎所有性能調優的過程—數據庫設計。
在數據庫設計完成後,可以 進行初步的索引設計,好的索引設計可以指導編碼階段寫出高效率的代碼,為整個系統的性能打下良好的 基礎。
以下是性能要求設計階段需要注意的:
1、數據庫邏輯設計的規范化
數據庫 邏輯設計的規范化就是我們一般所說的范式,我們可以這樣來簡單理解范式:
第1規范:沒有重復 的組或多值的列,這是數據庫設計的最低要求。
第2規范: 每個非關鍵字段必須依賴於主關鍵字, 不能依賴於一個組合式主關鍵字的某些組成部分。消除部分依賴,大部分情況下,數據庫設計都應該達到 第二范式。
第3規范: 一個非關鍵字段不能依賴於另一個非關鍵字段。消除傳遞依賴,達到第三范 式應該是系統中大部分表的要求,除非一些特殊作用的表。
更高的范式要求這裡就不再作介紹了 ,個人認為,如果全部達到第二范式,大部分達到第三范式,系統會產生較少的列和較多的表,因而減少 了數據冗余,也利於性能的提高。
2、合理的冗余
完全按照規范化設計的系統幾乎是不可 能的,除非系統特別的小,在規范化設計後,有計劃地加入冗余是必要的。
冗余可以是冗余數據 庫、冗余表或者冗余字段,不同粒度的冗余可以起到不同的作用。
冗余可以是為了編程方便而增 加,也可以是為了性能的提高而增加。從性能角度來說,冗余數據庫可以分散數據庫壓力,冗余表可以分 散數據量大的表的並發壓力,也可以加快特殊查詢的速度,冗余字段可以有效減少數據庫表的連接,提高 效率。