天天看點

探讨SQL語句技巧 優化DB2應用程式性能

當我們設計一個新的或分析一個現存的系統時,其中所要考慮的一個重要問題就是應用程式的設計問題。即使資料庫設計得很好而且還經過優化處理,應用程式設計不适當還是會引起性能問題的 資料庫。實踐證明,如果應用程式存在設計上的問題,那麼修改這些問題比調整資料庫配置參數更能改善應用程式的性能。例如,SQL是一種進階語言,具有很大的靈活性,從資料庫中提取相同的資料可以用不同形式的SELECT語句來實作,但是,應用程式的性能卻随着SELECT語句形式的不同而大相徑庭,這是因為不同形式的SELECT語句具有不同的處理成本。在這種情況下,我們就應該選擇那些處理成本低廉的SELECT語句,這樣,應用程式才會有較好的性能。

  DB2通用資料庫本身提供一個SQL編譯器,該編譯器建立編譯後的SQL語句,當該編譯器編譯SQL語句時,它将重新編寫這些SQL語句,以生成一種更容易對其進行優化的形式,這個過程稱之為“查詢重寫(query rewrite)”。

  然後,SQL編譯器産生許多滿足使用者查詢要求的、可選的執行方案,并根據表、索引、列和函數的統計數字來評估每個方案的執行成本,最後,從中選取執行成本最低的方案,該過程稱之為“查詢優化(query optimization)”。

  有一點很重要,需要我們注意,那就是不管存取方案的優劣,SQL編譯器(包括查詢重寫和優化兩個階段)必須從中選擇一個,以産生滿足應用程式查詢要求的結果集,是以,我們在編寫查詢代碼時,隻應查詢我們需要的資料,不需要的資料就不要查詢,這樣做的目的是確定SQL編譯器能夠選擇一個最好的存取方案。

  <b>編寫SELECT語句時一般遵循以下七個方面的準則:</b>

  <b>在SELECT清單中僅僅指明需要的列</b>

  我們在編寫SELECT語句時,盡管有時候不需要用到表中所有的字段,但還是習慣用*(表示引用表中所有的字段)來指定表中所有的列,這樣做在程式設計上确實很簡單、友善,但這麼做的後果是應用程式傳回一些我們不需要的列,系統做一些不必要的處理,做一些無用功,徒耗系統寶貴的軟、硬體資源,尤其當表中有很多字段時,這種浪費現象就越加明顯;而且,這也不是良好的程式設計習慣,我們不應提倡。

 <b> 使用謂詞來限制傳回的行數</b>

  在SQL程式設計語言中,按照評估過程中如何使用謂詞、何時使用謂詞,我們将謂詞劃分為四大類(這四類謂詞各自有不同的處理成本),按性能由高至低排列如下:

  ①範圍界定謂詞

  ②索引參數謂詞

  ③資料參數謂詞

  ④剩餘謂詞

  範圍界定謂詞是指那些限定索引掃描範圍的謂詞,它們為索引搜尋提供鍵值的起始值和/或終止值。索引參數謂詞不用于界定搜尋範圍,但可以根據索引對它進行評估,因為謂詞中的列是索引中的一部分。例如,假設表staff中的索引定義在name,dept和years三個字段上,執行下面的SELECT語句:頭兩個謂詞(name=’John’和dept=10)是範圍界定謂詞,而years&gt;5是索引參數謂詞,因為單憑上述資訊我們無法确定鍵years的起始值是多少,起始值可以是6,8,10,甚至更大。如果years的謂詞是years&gt;=5,那麼,它就是範圍界定謂詞了,因為索引搜尋可以從5開始。

  資料庫管理器在評估這些謂詞的時候将利用索引資料,而不是讀取資料庫中的基本表。這些範圍界定謂詞和索引參數謂詞通過減少需要從表中讀取的行的數目來減少存取的資料頁的數目。索引參數謂詞不影響被存取的索引頁的數目。

  資料參數謂詞是那些不能被索引管理器評估,卻能被資料管理服務(DMS)評估的謂詞。通常,這種謂詞需要從基本表中存取個别行,如果需要的話,資料管理服務還會提取需要的列來評估該謂詞。