在應用系統的設計中,要着重考慮以下幾點:

 1.合理使用索引

  索引是數據庫中重要的數據結構,它的根本目的就是提高查詢效率。索引的使用要恰到好處,其使用原則如下:

  在經常進行連接,但是沒有指定爲外鍵的列上建立索引,而不經常連接的字段則由優化器自動生成索引;在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引;在條件表達式中經常用到的不同值較多的列上建立索引,在不同值少的列上不要建立索引。比如在僱員表的“性別”列上只有“男”與“女”兩個不同值,因此就無必要建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重降低更新速度。 如果待排序的列有多個,可以在這些列上建立複合索引。

  2. 避免或簡化排序

  應當儘量簡化或避免對大型表進行重複的排序。當能夠利用索引自動以適當的次序產生輸出時,優化器就避免了排序這個步驟。爲了避免不必要的排序,就要正確地增建索引,合理地合併數據庫表(儘管有時可能影響表的規範化,但相對於效率的提高是值得的)。如果排序不可避免,那麼應當試圖簡化它,如縮小排序的列的範圍等。

  3.消除對大型錶行數據的順序存取

  在嵌套查詢中,表的順序存取對查詢效率可能產生致命的影響。我們有時可以使用並集來避免順序存取。儘管也許在所有的檢查列上都有索引,但某些形式的where子句會強迫優化器使用順序存取,這一點也應注意。

  4. 避免相關子查詢

  如果一個列同時在主查詢和where子句中出現,很可能當主查詢中的列值改變之後,子查詢必須重新查詢一次。而且查詢嵌套層次越多,效率越低,因此應當儘量避免子查詢。如果子查詢不可避免,那麼要在子查詢中過濾掉儘可能多的行。

  5.避免困難的正規表達式

  mathes和like關鍵字支持通配符匹配,但這種匹配特別耗時。例如:select * from customer where zipcode like “98_ _ _”,即使在zipcode字段上已建立了索引,在這種情況下也還是採用順序掃描的方式。如果把語句改爲:select * from customer where zipcode >“98000”,在執行查詢時就會利用索引來查詢,顯然會大大提高速度。

  6.使用臨時表加速查詢

  把表的一個子集進行排序並創建臨時表,有時能加速查詢。它有助於避免多重排序操作,而且在其他方面還能簡化優化器的工作。臨時表中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁盤i/o,所以查詢工作量可以得到大幅減少。但要注意,臨時表創建後不會反映主表的修改。在主表中數據頻繁修改的情況下,注意不要丟失數據。

  操作系統相關優化

  操作系統性能的好壞直接影響數據庫的使用性能,如果操作系統存在問題,如cpu過載、過度內存交換、磁盤i/o瓶頸等,在這種情況下,單純進行數據庫內部性能調整是不會改善系統性能的。我們可以通過windows nt的系統監視器(system monitor)來監控各種設備,發現性能瓶頸。

  cpu 一種常見的性能問題就是缺乏處理能力。系統的處理能力是由系統的cpu數量、類型和速度決定的。如果系統沒有足夠的cpu處理能力,它就不能足夠快地處理事務以滿足需要。我們可以使用system monitor確定cpu的使用率,如果以75%或更高的速率長時間運行,就可能碰到了cpu瓶頸問題,這時應該升級cpu。但是升級前必須監視系統的其他特性,如果是因爲sql語句效率非常低,優化語句就有助於解決較低的cpu利用率。而當確定需要更強的處理能力,可以添加cpu或者用更快的cpu 替換。

  內存 sql server可使用的內存量是sql server性能最關鍵因素之一。而內存同i/o子系統的關係也是一個非常重要的因素。例如,在i/o操作頻繁的系統中,sql server用來緩存數據的可用內存越多,必須執行的物理i/o也就越少。這是因爲數據將從數據緩存中讀取而不是從磁盤讀取。同樣,內存量的不足會引起明顯的磁盤讀寫瓶頸,因爲系統緩存能力不足會引起更多的物理磁盤i/o。

  可以利用system monitor檢查sql server的buffer cache hit ratio計數器,如果命中率經常低於90%,就應該添加更多的內存。

  i/o子系統 由i/o子系統發生的瓶頸問題是數據庫系統可能遇到的最常見的同硬件有關的問題。配置很差的i/o子系統引起性能問題的嚴重程度僅次於編寫很差的sql語句。i/o子系統問題是這樣產生的,一個磁盤驅動器能夠執行的i/o操作是有限的,一般一個普通的磁盤驅動器每秒只能處理85次i/o操作,如果磁盤驅動器超載,到這些磁盤驅動器的i/o操作就要排隊,sql的i/o延遲將很長。這可能會使鎖持續的時間更長,或者使線程在等待資源的過程中保持空閒狀態,其結果就是整個系統的性能受到影響。

  解決i/o子系統有關的問題也許是最容易的,多數情況下,增加磁盤驅動器就可以解決這個性能問題。

  當然,影響性能的因素很多,而應用又各不相同,找出一個通用的優化方案是很困難的,只能是在系統開發和維護的過程中針對運行的具體情況,不斷加以調整。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章