提示
(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...