跳轉到內容

Oracle 和 DB2,比較和相容性/流程模型/最佳化器/Oracle

來自 Wikibooks,開放世界中的開放書籍

Oracle 基於成本的最佳化器 (CBO) 使用以前收集的統計資訊來建立最有效的 (最佳) SQL 執行計劃。這些統計資訊儲存在系統表空間中的資料字典中。您會記得系統表空間不能離線,原因之一是它包含資料字典,它是 DBMS 操作的核心元件。但是,可以將統計資訊儲存在資料字典之外,在這種情況下,它們不會影響最佳化器。也可以在資料庫之間複製統計資訊來為最佳化器提供種子。

Oracle 最佳化器 (CBO) 負責決定如何執行 SQL 語句。目標是以最有效的方式執行它們。最佳化器透過權衡所有可用的資訊來完成這項工作,並根據這些資訊制定一個執行計劃。最佳化器可利用的一些資訊來自環境 - 這些是有關資料的、索引的以及可用的機器資源的資訊。其他資訊由您根據業務需求提供。這些內容包括您如何利用機器資源以及您希望多快地返回資料。您可以為最佳化器提供許多因素,這些因素可以在資料庫級別、會話級別甚至 SQL 語句級別上進行設定。

我們將研究影響最佳化器的 4 個方面;您為其提供的引數、資料庫生成的統計資訊、資料 SQL 以及最佳化器提示。

最佳化器引數。

您可以調整許多最佳化器引數,但最有影響的是 OPTIMIZER_MODE。如前所述,Oracle 具有 B 樹和點陣圖索引。索引是效能結構,索引訪問通常比表掃描更快,尤其是在結果集很小且資料已聚簇的情況下(參見聚簇)。

對於需要排序的大型結果集,索引訪問可能比表掃描需要更多 I/O。雖然效率較低,但這會盡快將行返回給使用者。稍後,在“統計資訊”中,我們將看到最佳化器從資料庫操作(統計資訊)和環境(機器資源、資料分佈和 SQL)獲得的資訊型別。這些是最佳化器“知道”的東西,它“不知道”的是您希望如何將資料返回給您的偏好。OPTIMIZER_MODE 是您指定偏好的地方。


- all_Rows

all_rows 最佳化器模式傾向於表掃描而不是索引掃描。它旨在最佳化機器資源。如果最佳化器設定為 all-rows,將掃描表並將結果集寫入中間臨時表。只有在操作完成後,結果才會返回給終端使用者。這種執行模式將 I/O 降至最低,最適合 OLAP 和 DSS 型別系統,在這些系統中,通常需要處理大量資料,但將資料儘快返回給終端使用者並不重要。這就是 OLAP/DSS 系統具有長時間執行的分析查詢的情況,這些查詢通常在類似批處理的環境中執行。


- first_Rows

first_rows 最佳化器模式將使用索引掃描而不是表掃描。因為它讀取索引來定位行,然後讀取行,所以它是 I/O 密集型的,但是一旦讀取資料,就會將其返回給原始查詢。這種模式有利於 OLTP 型別應用程式,這些應用程式通常處理的資料量不多,但使用者坐在終端等待響應。


- 其他引數

您可以更改其他引數,以向最佳化器提供有關您的偏好或資料佈局方式的提示。通常,不需要更改這些引數,但如果您需要,可以選擇更改它們。這些引數允許您影響以下方面的成本權重:

- 排序區域大小(較大的排序區域意味著排序更有可能適合記憶體)

- 涉及索引的訪問路徑

- 是否要並行化表掃描

- 雜湊連線 VS 巢狀迴圈和排序合併表連線

- 索引在緩衝區快取中的可能性

- 散亂讀取相對於順序讀取的權重

最佳化器統計資訊。

您可以使用 DBMS_STATS 包或 ANALYZE 語句來收集有關表的、索引的或簇的物理儲存特性的統計資訊。與 ANALYZE 相比,推薦使用 DBMS_STATS 包來收集最佳化器統計資訊,但對於與最佳化器無關的統計資訊,例如空塊和平均空間,您必須使用 ANALYZE。

使用以下 DBMS_STATS 過程收集最佳化器統計資訊:


• GATHER_INDEX_STATS

• GATHER_TABLE_STATS

• GATHER_SCHEMA_STATS

• GATHER_DATABASE_STATS


當您使用 ANALYZE 時,它會在要分析的物件上獲取獨佔鎖,因此應在非高峰時段分析表。有兩種收集統計資訊的方法,即估計和精確。使用估計,最佳化器會從表中隨機抽取行,並使用這些資訊來估計整個表的統計資訊。這是最快的一種分析方法,對於特別大的表非常有用。使用精確方法,最佳化器會分析表中的每一行。雖然這種方法更準確,但需要更長的時間。由於收集的統計資訊儲存在資料字典中(資料字典始終可用),因此可以使用許多資料字典檢視(以 DBA_ 為字首)來驗證這些統計資訊的準確性。

dbms_stats 的另一個優點是它可以用來識別資料分佈的傾斜。

環境。

最佳化器完成其工作所需的大量資訊來自作業系統和資料庫本身的操作(即環境),這些資訊包括:

- 表的大小和分割槽

- 每個表列中不同值的個數

- 列值的分佈(資料傾斜)

- 並行查詢伺服器的可用性

- 資料行在資料塊上的聚簇


提示。

要覆蓋最佳化器,請在 SQL 和/或 PL/SQL 中放置“提示”。提示可以放置在任何 SQL 或 PL/SQL 塊中 - 匿名塊、儲存過程和觸發器。有各種微調最佳化器的方法,這些方法是針對以下情況的選擇:當表中的資料變化速度快於統計資訊中反映的速度時。一種微調方法是提示,另一種方法是在統計資訊看起來最佳時鎖定統計資訊。這是“最佳”與“可接受”之間的領域之一。如果您的最佳化器效能可接受,則無需對其進行微調。如果確實需要對其進行微調,則鎖定統計資訊或使用提示可以提供幫助,但這通常是使效能達到可接受水平的功能。努力追求最佳效能會導致收益遞減。您可以使用超過 130 種不同的提示來影響最佳化器,從而提供精細的控制。您可以影響諸如連線順序、訪問路徑、連線操作和並行路徑等方面。

華夏公益教科書