天天看點

Oracle資料庫性能優化之優化器元件

優化器包含三個元件:轉換器,估計器和計劃生成器。

下圖說明了這些元件。

Oracle資料庫性能優化之優化器元件

一組查詢塊表示已解析的查詢,這是優化器的輸入。下表描述了優化程式的操作。

步驟 執行方式 描述
1 查詢轉換器 優化器确定更改查詢的形式是否有幫助,以便優化器可以生成更好的執行計劃。
2 估算器 優化器根據資料字典中的統計資訊估算每個計劃的成本。
3 計劃生成器 優化器比較計劃的成本,然後選擇成本最低的計劃(稱為執行計劃)傳遞給行源生成器。

查詢轉換器

對于某些語句,查詢轉換器确定以較低的成本将原始SQL語句重寫為語義上等效的SQL語句是否有利。當存在可行的替代方案時,資料庫将分别計算替代方案的成本,并選擇成本最低的替代方案。下圖顯示了查詢轉換器将使用的輸入查詢重寫為使用OR的輸出查詢UNION ALL。

Oracle資料庫性能優化之優化器元件

估算器

所述估計器是确定一個給定的執行計劃的總成本的優化器元件。估算器使用三種不同的方法來确定成本:

選擇性

  • 查詢選擇的行集中的行百分比,0表示無行,1表示所有行。選擇性與查詢謂詞(例如WHERE last_name LIKE 'A%'或謂詞的組合)相關。謂詞在選擇性值接近時變得更具選擇性,而在價值接近時則變得0不那麼選擇性(或更具非選擇性)1。
  • 注意:選擇性是在執行計劃中不可見的内部計算。

基數

  • 基數是執行計劃中每個操作傳回的行數。此輸入對于獲得最佳計劃至關重要,對于所有成本功能都是相同的。估計器可以從收集的表統計資訊中得出基數DBMS_STATS,也可以在考慮到謂詞(過濾器,聯接等)DISTINCT或GROUP BY操作等的影響後得出基數。所述Rows在執行計劃列顯示了估計的基數。

成本

  • 該度量表示使用的工作機關或資源。查詢優化器将磁盤I / O,CPU使用率和記憶體使用率作為工作機關。

如下圖所示,如果統計資訊可用,則估算器将使用它們來計算度量。統計資訊提高了度量的準确性。

Oracle資料庫性能優化之優化器元件

對于示以上所示的查詢,估算器使用選擇性,估算的基數(總傳回10行)和成本測度得出其總成本估算為3:

Oracle資料庫性能優化之優化器元件

選擇性

選擇性表示,從行組的一小部分行集可以是基表,視圖或聯接的結果。選擇性與查詢謂詞(例如last_name= 'Smith')或謂詞的組合(例如)相關last_name = 'Smith' AND job_id = 'SH_CLERK'。注意:選擇性是在執行計劃中不可見的内部計算。

謂詞從行集中過濾出特定數量的行。是以,謂詞的選擇性訓示通過謂詞測試的行數。選擇性範圍是0.0到1.0。選擇性為0.0表示未從行集中選擇任何行,而選擇性為1.0表示已選擇所有行。謂詞在值接近0.0時變得更具選擇性,而在值接近1.0時則變得不那麼選擇性(或更不選擇性)。優化程式根據統計資訊是否可用來估計選擇性:

  • 統計資料不可用

根據OPTIMIZER_DYNAMIC_SAMPLING初始化參數的值,優化器将使用動态統計資訊或内部預設值。資料庫根據謂詞類型使用不同的内部預設值。例如,相等謂詞(last_name = 'Smith')的内部預設值低于範圍謂詞(last_name > 'Smith')的内部預設值,因為期望相等謂詞傳回較小的行部分。

  • 可用統計

當統計資料可用時,估計器将使用它們來估計選擇性。假設有150個不同的員工姓氏。對于相等謂詞last_name = 'Smith',選擇性是的n不同值的數量的倒數last_name,在此示例中為0.006,因為查詢從150個不同值中選擇包含1的行。

如果last_name列上存在直方圖,則估計器将使用直方圖而不是不同值的數量。直方圖捕獲了列中不同值的分布,是以它産生了更好的選擇性估計,尤其是對于那些具有資料偏斜的列。

基數

基數是由每個操作在執行計劃中傳回的行的數目。例如,如果優化程式對全表掃描傳回的行數的估計為100,則此操作的基數估計為100。基數估計出現在Rows執行計劃的列中。優化器基于一組複雜的公式來确定每個操作的基數,這些公式使用表和列級别的統計資訊或動态統計資訊作為輸入。當單個等式謂詞出現在單表查詢中且沒有直方圖時,優化器将使用最簡單的公式之一。在這種情況下,優化器采用均勻分布,并通過将表中的行總數除以WHERE子句謂詞中使用的列中不同值的數量,來計算查詢的基數。例如,使用者hr查詢employees表如下:

SELECT first_name, last_name
FROM   employees
WHERE  salary='10200';           

該employees表包含107行。目前的資料庫統計資訊表明,該salary列中不同值的數量為58。是以,優化器2使用公式将結果集的基數估計為107/58=1.84。基數估計必須盡可能準确,因為它們會影響執行計劃的所有方面。當優化器确定連接配接成本時,基數很重要。例如,在employees和departments表的嵌套循環連接配接中,in 的行數employees決定了資料庫必須多久探測一次departments表。基數對于确定分類成本也很重要。

成本

成本是表示用于一個計劃的估計資源使用的内部數值量度。該費用特定于優化器環境中的查詢。為了估算成本,優化器會考慮以下因素:

  • 系統資源,包括估計的I / O,CPU和記憶體
  • 估計傳回的行數(基數)
  • 初始資料集的大小
  • 資料配置設定
  • 通路結構

成本是優化程式用來比較同一查詢的不同計劃的内部度量。您無法調整或更改成本。執行時間是成本的函數,但是成本并不直接等于時間。例如,如果查詢A的計劃的成本比查詢B的計劃低,那麼可能會有以下結果:

  • A的執行速度比B快。
  • A的執行速度比B慢。
  • A與B的執行時間相同。

是以,無法互相比較不同查詢的成本。此外,您無法比較使用不同優化器模式的語義等效查詢的成本。

執行計劃生成器

執行計劃生成器探讨了通過嘗試不同的通路路徑查詢塊各種各樣的計劃,連接配接方法和連接配接順序。由于資料庫可以使用多種組合來産生相同的結果,是以可能有許多計劃。優化器選擇成本最低的計劃。下圖顯示了優化程式測試輸入查詢的不同計劃。

Oracle資料庫性能優化之優化器元件

優化器跟蹤檔案中的以下代碼片段顯示了優化器執行的一些計算:

GENERAL PLANS
***************************************
Considering cardinality-based initial join order.
Permutations for Starting Table :0
Join order[1]:  DEPARTMENTS[D]#0  EMPLOYEES[E]#1
 
***************
Now joining: EMPLOYEES[E]#1
***************
NL Join
  Outer table: Card: 27.00  Cost: 2.01  Resp: 2.01  Degree: 1  Bytes: 16
Access path analysis for EMPLOYEES
. . .
  Best NL cost: 13.17
. . .
SM Join
  SM cost: 6.08
     resc: 6.08 resc_io: 4.00 resc_cpu: 2501688
     resp: 6.08 resp_io: 4.00 resp_cpu: 2501688
. . .
SM Join (with index on outer)
  Access Path: index (FullScan)
. . .
HA Join
  HA cost: 4.57
     resc: 4.57 resc_io: 4.00 resc_cpu: 678154
     resp: 4.57 resp_io: 4.00 resp_cpu: 678154
Best:: JoinMethod: Hash
       Cost: 4.57  Degree: 1  Resp: 4.57  Card: 106.00 Bytes: 27
. . .

***********************
Join order[2]:  EMPLOYEES[E]#1  DEPARTMENTS[D]#0
. . .
***************
Now joining: DEPARTMENTS[D]#0
***************
. . .
HA Join
  HA cost: 4.58
     resc: 4.58 resc_io: 4.00 resc_cpu: 690054
     resp: 4.58 resp_io: 4.00 resp_cpu: 690054
Join order aborted: cost > best plan cost
***********************           

跟蹤檔案顯示優化器首先嘗試将該departments表作為聯接中的外部表。優化器為三種不同的聯接方法計算成本:嵌套循環聯接(NL),排序合并(SM)和哈希聯接(HA)。優化器選擇哈希聯接作為最有效的方法:

Best:: JoinMethod: Hash
       Cost: 4.57  Degree: 1  Resp: 4.57  Card: 106.00 Bytes: 27           

然後,優化器使用employees外部表嘗試不同的連接配接順序。此連接配接訂單的成本比先前的連接配接訂單高,是以被放棄。當找到成本最低的計劃時,優化器使用内部截止來減少嘗試的計劃數量。截止時間基于目前最佳計劃的成本。如果目前的最佳成本很高,則優化器将探索替代計劃以找到較低成本的計劃。如果目前的最佳成本很小,則優化器會迅速結束搜尋,因為進一步的成本改善并不明顯。