目前本人在看《SQL Server性能調優實戰》 ,以下內容是本人看本書的筆記 資料庫性能取決於各方面綜合因素: 硬體,操作系統,軟體 硬體:記憶體,CPU,磁碟 當伺服器的物理記憶體不足時,會產生大量的磁碟I/O,給磁碟帶來壓力; 當記憶體不足時,一些占用CPU資源較多的對象可能就無法被正常緩存在記憶體中 ...
目前本人在看《SQL Server性能調優實戰》 ,以下內容是本人看本書的筆記
資料庫性能取決於各方面綜合因素:
硬體,操作系統,軟體
硬體:記憶體,CPU,磁碟
當伺服器的物理記憶體不足時,會產生大量的磁碟I/O,給磁碟帶來壓力;
當記憶體不足時,一些占用CPU資源較多的對象可能就無法被正常緩存在記憶體中,需要使用大量的CUP資源來處理這些對象的計算,從而給CPU帶來更大的壓力
記憶體:
1.執行計劃緩存
資料庫引擎接收到需要執行的語句時,首先會經過一系列複雜的計算和分析,得到相應的執行計劃,然後再根據執行計划進行各種操作,
由於執行計劃的計算和分析需要的CPU資源比較多,所以很容易引起CPU資源的緊張,為瞭解決這個問題,資料庫就會把執行計劃緩存起來
2.數據緩存
若遇到數據訪問操作符,則會首先檢查對應的數據是否在數據緩存中,如果存在就從緩存中取數據,否則會從磁碟中讀取數據,然後再把數據緩存到緩存中
如果資料庫記憶體不足,資料庫引擎會演算法把不常用的緩存清理,把需要的數據從磁碟中讀取並緩存到數據緩存中,這會引起大量的磁碟I/O,並且導致執行語句的執行效率低下
若大批的語句出現這種情況,就會導致伺服器CPU占用率飆高。如果伺服器CPU長期處於繁忙狀態,並且資料庫的磁碟I/O偏高,估計是資料庫的記憶體達到了瓶頸
CPU:
資料庫在進行任務調度,執行計劃分析,排序等計算時都需要使用大量的CPU資源
CPU資源在30%上下時:當前伺服器較空閑
CPU資源在60%上下時:當前伺服器較繁忙
CPU資源達到80%時:伺服器非常繁忙,就要查找原因了(通常情況下,一些執行效率較高,並且性能不理想的語句會造成這樣的問題;少數情況下是由於資料庫伺服器達到了瓶頸)
針對高併發的資料庫系統,建議使用如下配置方案:
將主資料庫的數據文件拆分成多個文件
將數據文件和日誌文件存放在不同的物理磁碟,從而提高I/O的併發。
系統資料庫文件,特別是Tempdb的數據文件要放在獨立的物理磁碟,並將數據文件拆分成多個,建議與邏輯CPU的個數相同,以提高併發
設計表建議:
儘可能的添加數據完整約束,例如:非空約束,預設值約束,check約束,唯一約束,外鍵約束等,這些約束的添加降有助於資料庫關係引擎分析執行計劃
使用儘可能小的欄位類型,特別是大表,儘量小的空間將可以帶來更佳的性能
表結構的設計應考慮業務需求帶來的操作及頻率,儘可能的使業務邏輯實現簡潔,使用簡單的SQL語句,可避免過多的表關聯
編寫SQL語句建議:
編寫語句前,先明確已經完全理解了業務需求,並知道表的用途及用法
確定業務需要用到的過濾欄位能否使用索引,是否有必要在欄位上添加索引
不要多有索引的欄位進行任何的計算,包括函數,因為這會導致無法使用索引進行數據檢索,從而導致掃描操作
小表操作優先,以小表驅動大表,使其儘量使用NESTED LOOP-嵌套迴圈(NESTED LOOP是表關聯操作的一種物理操作方式,它使用foreach的方式以較小數據量的數據集為驅動,內嵌foreach迴圈較大的表進行對比,其效率比其他幾個關聯操作高,)
只查詢需要的欄位,避免*
儘量使用簡單的SQL語句來實現業務功能,如果功能過於複雜,可以考慮將其拆分成若幹個簡單的SQL語句
簡單的SQL:
關聯的表最多不超過4個
沒有複雜的過濾條件,只有2到3個過濾條件,可以使用索引查找操作