oracle調優HINT提示

2021-05-28 06:24:10 字數 4264 閱讀 4055

提示

(hint)

從oracle7

中引入,目的是彌補基於成本優化器的缺陷。提示通常用來改變

sql執行計畫,提高執行效率。

1.

使用提示需要遵循的原則

1)仔細檢查提示語法。盡量使用完整注釋語法

/*+ hint */ 2)

使用表別名。如果在查詢中指定了表別名,那麼提示必須也使用表別名。例如:

select /*+ index(e,dept_idx) */ * from emp e; 3)

不要在提示中使用模式名稱:如果在提示中指定了模式的所有者,那麼提示將被忽略。例如:

select /*+ index(scott.emp,dept_idx) */ * from emp;

4)檢驗提示。如果提示指定了不可用的訪問路徑,那麼這個提示將被忽略。

2.

導致提示無效的條件:

提示

被忽略的條件

cluster

與非簇表一同使用

hash

與非簇表一同使用

hash_aj

不存在子查詢

index

指定的索引不存在

index_combine

不存在位圖索引

merge_aj

不存在子查詢

parallel

呼叫的不是table access full計畫

push_subq

不存在子查詢

star

事實表中存在不恰當的索引

use_concat

在where子句中不存在多個or條件

use_nl

表中不存在索引

3.

幾種主要的優化模式:

1)all_rows:

all_rows

是基於成本的優化方法,目的是提供整體最佳的吞吐量和最小的資源消耗。all_rows

提示傾向使用全表掃瞄,而且不適用於

oltp

資料庫。使用

all_rows

提示應該保障查詢中涉及的表和索引擁有使用

analyze

命令分析得到的統計資料。

2)rule:

rule

提示使oracle

為查詢提供基於規則的優化模式。在懷疑

cbo生成了非優化的執行計畫時,通常首先嘗試使用

rule

提示。rule

提示忽略表和索引的統計資料,並且使用基本的試探法生成執行計畫。

3)first_rows

:這個提示是基於成本的優化方法,目的是提供最快的反應時間。使用

first_rows

提示應該保障查詢中涉及的表和索引擁有使用

analyze

命令分析得到的統計資料。

4.

表的連線提示

1)use_hash

提示

use_hash

提示對指定的表進行雜湊連線。雜湊連線是

oracle

用以驅動表(最小的表)向

ram區中裝載記錄的方法,

ram區由

hash_area_size

定義。雜湊連線適合中間結果比較大的情況。使用雜湊連線時

,hash_area_size

對速度影響非常大,如果驅動表不能一次裝入記憶體,那麼需要使用

temp

表空間,這種情況下速度比較慢。這個引數可以在

session

級別動態修改,需要進行雜湊連線時可以臨時增大,速度可能顯著增加。

2)use_merge

提示

use_merge

提示強制執行乙個排序合併操作。排序合併操作通常與並行查詢結合使用,因為排序合併操作傾向於全表掃瞄。該提示適合於生成大型結果集的查詢。

3)use_nl

use_nl

提示將強制對目標表執行巢狀迴圈連線。use_nl

提示很少用於

sql調整,因為

cbo和

rbo更傾向於使用迴圈巢狀連線。

4)star

提示

star

提示強制使用星型查詢計畫。前提是查詢中至少三個表,而且在事實表中存在恰當的索引。

5.

表反連線提示

sql反連線是指在語句中包含

not in

或者not exists

子句時執行的操作。

1)merge_aj

在使用全表訪問比索引訪問更好的情況下,可以在

not in

子查詢中使用

merge_aj

提示以便執行反連線。

2)hash_aj

hash_aj

提示放在

not in

子查詢中用來希望執行雜湊連線時,執行雜湊反連線。

hash_aj

和merge_aj

要求子查詢列非空。

6.index

提示

1)index

提示簡介:

index

提示被用於顯示指定表名或表名與索引。如果只指定了表名,那麼優化器將使用表中的"最優

"索引。在永久優化

sql語句中,建議指定表和索引。

2)index_join

提示

index_join

提示明確要求優化器使用索引連線來作為訪問路徑。

3)and_equal

提示

and_equal

提示可以使多個非唯一的索引合併索引,並且使這些索引操作時就象單個連續索引一樣。該提示如果被應用,在查詢計畫中顯示的是

and-equal

4)index_asc

提示

index_asc

提示使用公升序索引。這是預設的優化器行為。

5)no_index

提示

該提示忽略索引存在,類似

full

6)index_combine

提示

index_combine

提示用來強制使用位圖索引作為表的訪問路徑。

7)index_ffs

提示

索引快速完全掃瞄可以在不訪問任何記錄的情況下完成查詢。

8)use_concat

提示

use_concat

提示要求為所有的

or條件使用

union all

執行計畫,並將這個查詢重新書寫為多個查詢。如果在

where

子句中存在大量

or條件,可以考慮使用

use_concat

提示。7.

總結

1)因為提示放在注釋中,所以如果提示與現存的執行計畫不相容,或者提示不正確,有可能被忽略。

2)在使用

rbo時,可以通過提示將指定的查詢更改為

cbo。切記要對查詢中涉及的所有表和索引進行分析。

3)在使用

cbo的時候,可以通過新增

rule

提示或者

first_rows

提示來開始調整乙個可以優化的

sql語句。

4)提示可以在子查詢中使用,但是外部查詢的提示不會帶入子查詢。

5)如果在查詢計畫中發現卡笛爾積(

cartesian

),則要盡量解決。

對hint的調優

實際工作中經常遇到開發人員加hint為提高資料的批處理的速度,但為了提高處理速度經常遇到並行的hint隨意使用,並行不是萬能的,不合理的使用只能阻礙執行速度,使用如下sql說明並行問題 select leading t1 use hash t lgin parallel t1,8 t1.rpo no...

oracle調優筆記

在sqlplus中輸入 desc v libraycache v sgastat v sql v sqlarea v sqltext v db object cache select from v librarycache col namespace format a10 設定格式長度 查詢執行次數...

Oracle調優參考

一 查oracle引數並進行調整1 檢視oracle的init.ora檔案 引數一 db block buffers 引數二 shared pool size 引數三 process 500 引數四 distributed stransactions 200 引數五 sort area size 1...