關係型數據庫性能優化總結(轉)

關係型數據庫性能優化總結

做者: 劉曉軍  來源: 博客園  發佈時間: 2010-12-12 21:09  閱讀: 2763 次  推薦: 1   原文連接   [收藏]  
摘要:今天咱們要討論的是關係型數據庫性能優化的問題,平時咱們也最好要遵照必定的規則,但願對你們有所幫助。

  對於web應用開發,多數性能瓶頸均出如今數據庫上,除了採用分佈式架構或雲處理(大公司基本上都是),更重要的是平時程序設計時要遵守一些規則,從根本上提升系統的性能,如下總結了一些經常使用的規則方法,僅供參考,歡迎跟帖補充。。。html

  一、 把數據、日誌、索引放到不一樣的I/O設備上,增長讀取速度。數據量(尺寸)越大,提升I/O越重要。web

  二、 縱向、橫向分割表,減小表的尺寸,如:能夠把大數據量的字段拆分表。數據庫

  三、 根據查詢條件,創建索引,優化索引、優化訪問方式,限制結果集的數據量。注意填充因子要適當(最好是使用默認值0)。索引應該儘可能小,儘可能使用字節數小的列建索引,不要對有限的幾個值的列建單一索引。性能優化

  四、 用OR的字句能夠分解成多個查詢,而且經過UNION連接多個查詢。它們的速度只與是否使用索引有關,若是查詢須要用到聯合索引,用UNION all執行的效率更高。服務器

  五、 在查詢SELECT語句中用WHERE子句限制返回的行數,避免表掃描。若是返回沒必要要的數據,則浪費了服務器的I/O資源,加劇了網絡的負擔,下降了性能。若是表很大,在表掃描期間將表鎖住,禁止其餘的聯結訪問表,後果很嚴重。網絡

  六、 注意使用DISTINCT,在沒有必要時不要用,它同UNION同樣會使查詢變慢。架構

  七、 在IN後面值的列表中,將出現最頻繁的值放在最前面,出現最少的放在最後面,減小判斷的次數。分佈式

  八、 通常在GROUP BY和HAVING子句以前就能剔除多餘的行,因此儘可能不要用它們來作剔除行的工做,也就是說盡量在WHERE中過濾數據。函數

  九、 儘可能將數據的處理工做放在服務器上,減小網絡的開銷,如使用存儲過程。存儲過程是編譯、優化過,而且被組織到一個執行規劃裏,且存儲在數據庫中的SQL語句(存儲過程是數據庫服務器端的一段程序),是控制流語言的集合,速度固然快。性能

  十、不要在一句話裏再三地使用相同的函數,浪費資源,將結果放在變量裏再調用更快。

  十一、針對大量只讀查詢操做進行優化的方法:

1)數據量小的數據,能夠考慮不存儲在數據庫中,而是經過程序常量的方式解決。

2)須要存儲在數據庫中的數據,能夠考慮採用物化視圖(索引視圖)。當DBA在視圖上建立索引時,這個視圖就被物化(執行)了,而且結果集被永久地保存在惟一索引中,保存方式與一個有聚簇索引的表的保存方式相同。物化視圖減除了爲引用視圖的查詢動態創建結果集的開銷,優化人員能夠在查詢中使用視圖索引,而不須要在FROM子句中直接指定視圖。

3)數據存儲時能夠考慮適當的數據冗餘,以減小數據庫表之間的連接操做,提升查詢效率。

4)針對數據的特色,採起特定的索引類型。例如,位圖索引等。

  十二、對於SQL語句書寫時的一些建議:

1)寫語句時可以肯定數據庫對象全部者的,儘量把全部者帶上,如:

SELECT * FROM dbo.Users

2)存儲過程當中,參數定義最好放在最前面,儘量一次定義,如:

DECLARE @USER_ID INT

       ,@USER_NAME   VARCHAR(50)

       ,@PASSWORD VARCHAR(50)

3)爲參數賦值時,儘量一次賦值,如:

SELECT @USER_ID = 1001

       ,@USER_NAME = 'xiaojun.liu'

4)儘可能少用遊標

相關文章
相關標籤/搜索