在 oracle 中,可以通過為語句新增hint (提示) 來實現干預優化器優化的目的。hint的使用類似於注釋,
/*+hint1 hint2 / 是在 * 後面加上乙個 + 表示hint 多個hint鍵使用乙個或者多個空格進行分割,另外如果oracle發現hint 語法有錯誤,oracle不會報錯,只是把 / * */ 裡的內容當做注釋而已。所以此處就列舉一些hint出錯的情況,僅供參考。
「*」 和「+」 之間不能有空格
-- 建立測試表
create
table test_tab(
userid number(6)
notnull
,name varchar2(8)
);create
index ind_userid on test_tab(userid)
;insert
into test_tab values(1
,'aa');
insert
into test_tab values(2
,'bb');
insert
into test_tab values(3
,'cc');
insert
into test_tab values(4
,'dd');
insert
into test_tab values(5
,'ee');
insert
into test_tab values(6
,'ff');
insert
into test_tab values(7
,'gg');
insert
into test_tab values(8
,'hh');
commit
;
如果我們希望查詢使用全表掃瞄可以使用full這個 hint強制全表掃瞄,如果 * 和 + 之間有空格,如下:
select
/* + full(test_tab) */
*from test_tab where userid =
3;
如果這樣寫 oracle 只能是認為/* 和 */ 之間的是注釋,語句無法生效,查詢執行計畫中 hint 沒有生效;
如果表指定了別名,那麼hint 中也要使用別名。
仍然使用如上的測試表,測試語句如下:
select
/*+ full(test_tab) */
*from test_tab a where a.userid =
3;
如果不使用別名,那麼執行計畫中hint不會生效。
使用巢狀查詢時,內層的別名在外側是無法使用的,所以如果hint中使用了內層的別名,也是無效的。
select
/*+ full(b idx_userid1) */ a.userid from test_tab a where a.userid in
(select b.userid from test_tab b where a.userid = b.userid)
;
多個提示之間分割不能使用『 , 』 必須使用空格
如下查詢語句希望是走全表掃瞄,結果發現hint失效
select
*from test_tab a where a.userid =
3;
另外,一些很常見的hint形式,比如:
/*+ parallet(t,8) */
,/*+ index(t,t_idx) */
雖然當前沒有問題,但是標準的寫法應該是:
/*+ parallet(t 8) */
,/*+ index(t t_idx) */
select
*into b select
*from a;
使用ADO MySQL時經常出現的錯誤分析及總結
環境 windows xp sp2 delphi 7 myodbc 3.51 問題 在odbc中配置mysql資料來源 如hydro 完全正常,但是在d7中 1,使用adoconnection有問題。在配置其connectionstring時,如果選擇了資料來源hydro,在初始資料庫下拉框中也能夠...
Lnmp中nginx經常出現502錯誤解決方法
nginx 502多半的原因是資源不足或nginx配置的一些問題導致的,下面我來給提供了乙個利用nginx輪詢php服務池狀態然後進行相關處理,希望例子能幫助你解決問題。先從fastcgi配置入手 1.檢視fastcgi程序是否已經啟動nginx 502錯誤的含義是sock 埠沒被監聽造成的。我們先...
Linux 核心變更導致驅動經常出現的錯誤記錄
1 error cflags was changed in fix it to use ccflags y。解決方法 export kbuild nopedantic 1 解決方法 修改makefile中的 cflags 為 extra cflags 或 ccflags y 2 linux conf...