hint在判斷sql效能問題時,有時會啟乙個快捷作用,是乙個調優sql強大工具
1./*+ driving_site(table) */ --將過濾的條件於遠端完成再傳過來,如在a伺服器上過濾再將結果傳到b伺服器上,原則是哪個表資料小就將它與遠端大表匹配再將結果返回;
2./*+ index(t idx_id) */--指定索引
4./*+ index(view.t1 idx_name) */ --對檢視中的基表進行指定走索引
5./*+ parallel(table,4) */eg. select /*+ parallel(t1,4) */ * from t1;併發執行前加alter session enable parallel dml;
注意:當使用hint時如果結果集不完整或有錯,優化器將忽略它;
6.優化器相關
alter system set optimizer_mode=first_rows(all_rows) --系統級別設定,也可在會話級別session
select /*+ first_rows(20) */ * from t1 where id<20; --cbo模式
select /*+ all_rows */ * from t1 where id<20; --cbo模式
-在sql中使用hint的優先順序要高於optimizer_mode的引數設定;
select /*+ rule */ * from t1; --rbo優化器模式
7.訪問路徑相關的hint
包含:cluster,full,hash,index,no_index,index_asc,index_desc,index_combine,index_join,index_ffs,index_ss,index_ss_asc,index_ss_desc,no_index_ffs,no_index_ss,ordered,leading,use_hash,no_use_hash;
select /*+ full(t1) */ * from t1;--全表掃瞄
select /*+ index(t1 idx_name) */ * from t1 where object_id>2;使用指定索引
select /*+ no_index(t1 idx_name) */ * from t1 where object_id>2; --不使用指定索引
select /*+ index_desc(t1 idx_name) */ * from t1 where object_id=2; --按索引降序順序訪問資料
select /*+ index_combine(t1 idx_name) */ * from t1;--選擇位圖索引
select /*+ index_ffs(t1 idx_name) */ from t1 where object_id <100; --索引快速全表掃瞄(把索引當作乙個表看待)
select /*+ index_join(t1 idx_name1 idx_name2) */ * from t1 where object_id=5 and status='valid'; --同時使用條件列上的相關索引
select /*+ index_ss(t1 index_name) */ * from t1 where object_id=99; --跳躍式掃瞄
select /*+ leading(t1,t) */ t.* from t,t1 where t1.object_id=t.object_id; --指定t1為驅動作,優化器先訪問此表
select /*+ ordered */ t.* from t,t1 where t1.id=t.id; --指定按from 後面表的順序選擇驅表,t作為驅動表
select /*+ use_nl(t1,t) */ t.* from t1,t where t1.object_id=t.object_id;--使用nest loop表連線,適合含有小表資料關聯,如一大一小
select /*+ use_hash(t1,t) */ t.* from t1,t where t1.object_id=t.object_id;--使用hash表連線,適合兩個大表關聯
select /*+ use_merge(t1,t) */t.* from t1,t where t1.object_id=t.object_id;--使用合併排序表連線
select /*+ no_use_nl(t1,t) */ t.* from t1,t where t1.object_id=t.object_id; --不使用nest loop表連線
select /*+ no_use_hash(t1,t) */ t.* from t1,t where t1.object_id=t.object_id;--不使用hash表連線
select /*+ no_use_merge(t1,t) */t.* from t1,t where t1.object_id=t.object_id; --不使用合併排序表連線
8.並行相關hint
select /*+ parallel(t 4) */ count(*) from t1; --開啟表的4個並行度
select /*+ no_parallel(t) */ count(*) from t1; --不使用並行
表預設的degree(user_tables)如果不為0,預設開啟並行針對select;
9.其它hint
select /*+ dynamic_sampling(t 4) */ * from t where id>134;--4為取樣級別
select /*+ full(t1) cache(t1) */ object_id from t1;--將表t1放在lru端最活躍處,相當於表屬性的cache(keep);
--以上大部份資料**於譚懷遠《讓oracle跑得更快》學習
oracle常用hint新增
1.檢視新增索引 formatted on 2020 1 6 下午 04 46 37 qp5 v5.163.1008.3004 select index view name.table01 name,index01 name index view name.table01 name,index01 ...
ORACLE高階之一 HINT
最近由於需要經常統計資料,需要經常用到 hint 又不好意思每次都去麻煩 dba,所以在與 dbaoracle sql 語句時最常用到的 hint 使用方法 另外,我們以前的流程都是等應用發布之前,統一提交 dba check 然後再由開發人員修改 但是如果我們開發人員在寫這些語句的時候可以知道這些...
oracle調優HINT提示
提示 hint 從oracle7 中引入,目的是彌補基於成本優化器的缺陷。提示通常用來改變 sql執行計畫,提高執行效率。1.使用提示需要遵循的原則 1 仔細檢查提示語法。盡量使用完整注釋語法 hint 2 使用表別名。如果在查詢中指定了表別名,那麼提示必須也使用表別名。例如 select inde...