關係型資料庫效能優化總結(轉)

weixin_34054866發表於2010-12-20
對於web應用開發,多數效能瓶頸均出現在資料庫上,除了採用分散式架構或雲處理(大公司基本上都是),更重要的是平時程式設計時要遵照一些規則,從根本上提高系統的效能,以下總結了一些常用的規則方法,僅供參考,歡迎跟帖補充。。。

  1、 把資料、日誌、索引放到不同的I/O裝置上,增加讀取速度。資料量(尺寸)越大,提高I/O越重要。

  2、 縱向、橫向分割表,減少表的尺寸,如:可以把大資料量的欄位拆分表。

  3、 根據查詢條件,建立索引,優化索引、優化訪問方式,限制結果集的資料量。注意填充因子要適當(最好是使用預設值0)。索引應該儘量小,儘量使用位元組數小的列建索引,不要對有限的幾個值的列建單一索引。

  4、 OR的字句可以分解成多個查詢,並且通過UNION連結多個查詢。它們的速度只與是否使用索引有關,如果查詢需要用到聯合索引,用UNION all執行的效率更高。

  5、 在查詢SELECT語句中用WHERE子句限制返回的行數,避免表掃描。如果返回不必要的資料,則浪費了伺服器的I/O資源,加重了網路的負擔,降低了效能。如果表很大,在表掃描期間將表鎖住,禁止其他的聯結訪問表,後果很嚴重。

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

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

  8、 一般在GROUP BYHAVING子句之前就能剔除多餘的行,所以儘量不要用它們來做剔除行的工作,也就是說盡可能在WHERE中過濾資料。

  9、 儘量將資料的處理工作放在伺服器上,減少網路的開銷,如使用儲存過程。儲存過程是編譯、優化過,並且被組織到一個執行規劃裡,且儲存在資料庫中的SQL語句(儲存過程是資料庫伺服器端的一段程式),是控制流語言的集合,速度當然快。

  10、不要在一句話裡再三地使用相同的函式,浪費資源,將結果放在變數裡再呼叫更快。

  11、針對大量只讀查詢操作進行優化的方法:

1)資料量小的資料,可以考慮不儲存在資料庫中,而是通過程式常量的方式解決。

2)需要儲存在資料庫中的資料,可以考慮採用物化檢視(索引檢視)。當DBA在檢視上建立索引時,這個檢視就被物化(執行)了,並且結果集被永久地儲存在唯一索引中,儲存方式與一個有聚簇索引的表的儲存方式相同。物化檢視減除了為引用檢視的查詢動態建立結果集的開銷,優化人員可以在查詢中使用檢視索引,而不需要在FROM子句中直接指定檢視。

3)資料儲存時可以考慮適當的資料冗餘,以減少資料庫表之間的連結操作,提高查詢效率。

4)針對資料的特點,採取特定的索引型別。例如,點陣圖索引等。

  12、對於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)儘量少用遊標

相關文章