Oracle 內在索引和參數數的調整

  雖然系統級性能調優不是結構化查詢語言(SQL)性能調優的最好解決方案,但是,當你不能改變某些SQL語句時(例如,提供商提供的某些包中的SQL語句),使用SQL處理的常規模式來調節系統性能是極其有幫助的。在日常工作經驗的基礎上,Oracle數據庫管理員改變某些優化參數來適應庫緩衝區中SQL類型的變化是很常見的事。

  一些較爲常見的變更:

  1、針對Oracle參數的更改。對optimizer_mode,optimizer_index_cost_adj和optimizer_index_caching的改變能對SQL執行計劃產生巨大影響。

  2、 針對統計參數的更改。使用dbms_stats包導入特定的統計參數(針對當然處理模式作了調整的)可對SQL的執行速度產生巨大影響。

  3、使用自動化查詢重新寫入。使用Oracle實體化視圖能夠預先聚集、預先彙總數據,從而減少運行時刻表連接的數量。對於更新比較少的數據庫,也可以通過預先連接表來提高處理速度。

  一些對性能調優最重要的Oracle優化參數如下:

  * optimizer_mode(優化模式)-在Oracle 9i中,有許多優化模式,都是由參數optimizer_mode的值決定的。這個參數的取值範圍是rule, choose, all_rows, first_rows, first_rows_1, first_rows_10 和 first_rows_100.

  我們以定義“最好的”執行計劃作爲開始點。在任何給定的時間,庫緩衝區中的所有SQL語句都需要有“最好的”執行計劃(當然,由於在任何給定的時間裏處理需求可能不同,所以這個最優執行計劃可能會經常發生變化)。什麼是“最好的”執行計劃?是返回結果最快的執行計劃還是使用最少計算資源的執行計劃?很明顯,答案依賴於你的數據庫的處理過程,Oracle提供了兩種優化模式,允許你選擇你認爲的“最好的”執行計劃:

  1、 optimizer_mode=first_rows――相對全表掃描訪問,這個優化模式更注重索引訪問。當你想要一個查詢以最快的速度返回結果行時,即使它的邏輯輸入輸出總量比全表掃描高,也要使用這個模式在線訪問系統一般都使用這個模式,因爲終端用戶想要儘快地看到第一頁查詢結果。

  2、optimizer_mode=all_rows――這個優化模式更注重全表掃描(特別是併發全表掃描),因爲在這種情況下服務器資源的開銷最小。這個模式一般被用於批處理進程和數據倉庫中,它們的目標都是使服務器消耗的資源最小化。

  3、 optimizer_mode=first_rows_n――從Oracle 9i開始,又有一種新的優化模式針對某些返回小結果集的查詢進行優化。其取值範圍是first_rows_1, first_rows_10 和 first_rows_100,使用這些參數值可以確保Oracle能夠優化這類SQL。

  雖然參數optimizer_mode控制了“基於代價的優化”的總體行爲,還有其他Oracle參數也會對“基於代價的優化”產生相當大的影響。Oracle提供了一些重要的參數來控制“基於代價的優化”做出的選擇:

  1、optimizer_index_cost_adj――這個參數可用來調整“基於代價的優化”相對於全表掃描訪問而言,更加傾向於索引訪問的程度。這個值越小,“基於代價的優化”就越有可能使用一個可用的索引。

  2、 optimizer_index_caching――這個參數告訴Oracle你的索引在內存的數據緩衝區中的可能性有多大。對這個參數的設置將會影響到“基於代價的優化” 做出的對一個表連接(嵌套循環)使用索引還是使用全表掃描選擇。

  3、 db_file_multiblock_read_count――當把這個值設置得比較大時(使用更大的服務器),“基於代價的優化”識別出分散的(多塊)讀操作的代價或許比識別順序讀操作的代價更小一些。這就使得“基於代價的優化”更加傾向於全表掃描。

  但是從Oracle 9.2版本開始,情況不再是這樣了。當計算系統統計表時,它包含了“多塊讀操作記數”(MBRC),這個數字決定了全表掃描的成本。Oracle 10g則更進一步,加入了一些“系統默認值”,這些默認值是非常不合適的。對於Oracle 9.2版本而言,請注意Metalink上的149560.1。

  1、 parallel_automatic_tuning――當該參數設置爲“開啓”時,對於含有許多CPU的Oracle服務器,全表掃描併發執行。因爲併發全表掃描的速度可以非常快,所以“基於代價的優化”對於索引訪問開銷很大,因此更加傾向於使用全表掃描。

  2、 hash_area_size(假如不使用pga_aggregate_target的話)――這個參數設置“基於代價的優化”相對於使用嵌套循環和排序合併表連接來說,更傾向於使用哈希連接的程度。

  3、sort_area_size(只當不使用參數pga_aggregate_target時)――這個參數影響了“基於代價的優化”做出的執行索引訪問還是執行對結果集的排序的決定。這個參數值越高,則在內存中執行排序(比使用臨時表空間快上千倍)的可能性就越大,同時“基於代價的優化”相對於使用預先排序好的索引檢索,更傾向於使用直接排序。

  上海阜和進修學校

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章