Oracle 調優最佳化器索引成本調整與最佳化器索引快取

Oracle 調優最佳化器索引成本調整與最佳化器索引快取

為Oracle設定優化器索引成本調整參數的正確方法是什麼?作為一名開發人員,我觀察到隨著此參數的降低,性能得到了巨大的提高。普通查詢從2秒縮短到200毫秒。網路上有很多警告稱降低該值將導致資料庫出現嚴重問題,但沒有詳細說明會出現什麼問題。

我目前只看到了一個好處,即應用程式效能大大提高,沒有任何缺點。我需要更了解調整這些參數可能產生的負面影響。

答案1

不建議更改此參數的原因是它們對優化器具有資料庫範圍的影響 - 因此當您更改它以調整特定查詢時,它可能會對許多其他查詢產生一些影響。因此,在生產中更改它而不仔細測試整個應用程式是危險的。

然而:

  1. 在開發/測試環境中設定它,並在生產中保持相同的值可能是可以接受的(曾經是 OLTP 系統中的常見做法)。但是,您能確定您的應用程式將在專用資料庫中運行嗎?並且不會被合併到另一個具有預設參數集的資料庫中?
  2. 這些參數會有所幫助,因為 Oracle 使用一些有關 I/O 與 CPU 相對成本的啟發式方法,而在您的情況下,這些啟發式方法不夠好,因此 Oracle 選擇次優執行計劃。修復啟發式方法的建議方法是讓 Oracle 收集系統統計對於您的資料庫機器 - CPU 的速度有多快,在常規系統負載期間從 I/O 系統獲取單一區塊/多個區塊需要多長時間等。請參閱 Oracle 文檔

如果您想同時使用系統統計資料和優化器參數,請在谷歌上搜索,喬納森·劉易斯(Jonathan Lewis)寫過有關它的文章(抱歉,該網站不允許我發布多個連結)

我希望這有幫助

答案2

在生產環境中不應更改此參數。主要用途是強制更改計劃,以驗證不同執行計劃的效能。基本上,您建議優化器使用資料庫中的所有索引比其他存取路徑更便宜。這對於某些 sql 可能是正確的,而對於其他 sql 可能是錯誤的。

一旦你有了一個好的性能計劃,你應該理解為什麼優化器不使用它並嘗試修復(即沒有可用的新鮮/準確的統計數據 - >收集新鮮的、更準確的統計數據)。

希望有幫助,斯特凡諾

答案3

對於最常見的資料庫類型 OLTP 系統來說,這兩個參數的預設值非常糟糕。它們會導致更多的全表掃描和錯誤查詢。通常,您需要在上線之前設定這些參數。你在測試階段就這樣做。

如果您在上線後更改它們,那麼您可能會更改其他已調整為錯誤設定的查詢。聽起來您對資料庫調優了解不多,因為您提到的是回應時間而不是查詢計劃。您不應該觸摸這些參數。

大多數 DBA 不理解修復和設計之間概念的差異。上線後,您正在修復,此時您需要小心更改這些參數。在上線之前,您正處於設計和開發階段。那就是當你像這樣調整參數的時候。

順便說一句,這是從這些參數開始的好地方(在開始生產之前請注意,並且只有當您知道自己在做什麼時!)

Optimizer_index_cost_adj=10 優化器快取=90

這是針對 OLTP 的。對於批次處理,您想要開始的設定非常不同。我對這些進行了一些修改,但這些設定在 OLTP 上 99% 的情況下都能為我提供最佳的整體結果。然而,在我們投入生產後我不會碰它們。如果它們不好,我就讓它們不好並調整查詢。

相關內容