Oracle資料庫SQL語句效能調整的基本原則 (3)

idba發表於2008-05-10
 

在全表搜尋是一個最快的訪問方法時,將小表的全表搜尋放到快取中,調優專家應該確保有一個專門的資料緩衝用作行緩衝。在Oracle7中,你可以使用altertablexxxcache語句,在Oracle8或以上,小表可以被強制為放到KEEP池中緩衝。

確保最優的索引使用:對於改善查詢的速度,這是特別重要的。有時Oracle可以選擇多個索引來進行查詢,調優專家必須檢查每個索引並且確保Oracle使用正確的索引。它還包括bitmap和基於函式的索引的使用。

確保最優的JOIN操作:有些查詢使用NESTEDLOOPjoin快一些,有些則是HASHjoin快一些,另外一些則是sort-mergejoin更快。

這些規則看來簡單,不過它們佔SQL調優任務的100%,並且它們也無需完全懂得OracleSQL的內部運作。以下我們來簡單概覽以下OracleSQL的優化。

我們首先簡要檢視Oracle的排序,並且看一看排序操作是如何影響效能的。

調整Oracle的排序操作

排序是SQL語法中一個小的方面,但很重要,在Oracle的調整中,它常常被忽略。當使用createindex、ORDERBY或者GROUPBY的語句時,Oracle資料庫將會自動執行排序的操作。通常,在以下的情況下Oracle會進行排序的操作:

使用Orderby的SQL語句

使用Groupby的SQL語句

在建立索引的時候

進行tablejoin時,由於現有索引的不足而導致SQL優化器呼叫MERGESORT

當與Oracle建立起一個session時,在記憶體中就會為該session分配一個私有的排序區域。如果該連線是一個專用的連線(dedicatedconnection),那麼就會根據init.ora中sort_area_size引數的大小在記憶體中分配一個ProgramGlobalArea(PGA)。如果連線是通過多執行緒伺服器建立的,那麼排序的空間就在large_pool中分配。不幸的是,對於所有的session,用做排序的記憶體量都必須是一樣的,我們不能為需要更大排序的操作分配額外的排序區域。因此,設計者必須作出一個平衡,在分配足夠的排序區域以避免發生大的排序任務時出現磁碟排序(disksorts)的同時,對於那些並不需要進行很大排序的任務,就會出現一些浪費。當然,當排序的空間需求超出了sort_area_size的大小時,這時將會在TEMP表空間中分頁進行磁碟排序。磁碟排序要比記憶體排序大概慢14,000倍。

上面我們已經提到,私有排序區域的大小是有init.ora中的sort_area_size引數決定的。每個排序所佔用的大小由init.ora中的sort_area_retained_size引數決定。當排序不能在分配的空間中完成時,就會使用磁碟排序的方式,即在Oracle例項中的臨時表空間中進行。

磁碟排序的開銷是很大的,有幾個方面的原因。首先,和記憶體排序相比較,它們特別慢;而且磁碟排序會消耗臨時表空間中的資源。Oracle還必須分配緩衝池塊來保持臨時表空間中的塊。無論什麼時候,記憶體排序都比磁碟排序好,磁碟排序將會令任務變慢,並且會影響Oracle例項的當前任務的執行。還有,過多的磁碟排序將會令freebufferwaits的值變高,從而令其它任務的資料塊由緩衝中移走。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-264847/,如需轉載,請註明出處,否則將追究法律責任。

相關文章