Oracle的hint種類繁多,大致可以分為下面幾類:
優化方式和目標:如RULE、CHOOSE、FIRST_ROWS、ALL_ROWS等。
訪問路徑:如INDEX、FULL、CLUSTER、INDEX_FFS等。
查詢轉換:如MERGE、USE_CONCAT、NO_EXPAND等。
連接順序:如LEADING、ORDERED、STAR等。
連接操作:如USE_NL、USE_HASH、USE_MERGE等。
並行執行:如PARALLE、NOPARALLEL、PARALLEL_INDEX等。
其他類型;如APPEND、UNNEST、CACHE等。
INDEX只是Hint的一類。
關於LEADING、ORDERED:
/*+ORDERED*/提示按照from后表的順序執行。
/*+LEADING(table1 table2 ...)*/提示按照指定順序執行。
關於USE_NL、USE_HASH、USE_MERGE:
我測試的是10g,三者只需填寫表名作為參數,無順序需要,應該是Oracle自動選擇驅動表。
但是、可以用LEADING或ORDERED指定順序。
(注意)INDEX的使用影響的是表自身的查詢;USE_NL、USE_HASH、USE_MERGE影響的是表之間的連接。
詳細參考:http://hi.baidu.com/di_wan/modify/blog/618aedca267ab783c8176829
關於INDEX參考:http://hi.baidu.com/di_wan/blog/item/fd943290b5a66388a877a424.html
Hint是把雙刃劍,甚至是顆炸彈。
對於DB設計者、SQL制作者、DBA在優化SQL時,存在以下效率的高低:
追加約束條件 > 調整SQL邏輯 > 設計INDEX > 加入Hint
而且越后面的風險也越大。
因為開發環境、測試環境、最終客戶環境的數據量、數據庫版本、硬件等等總會有不同;
而Hint是強制執行的(自動忽略錯誤Hint語句),
就會產生在某處高效的Hint,在另一處卻非常耗費資源。
如果不是可以在最終客戶環境上操作的DBA,最好不要寫Hint,
只要做好INDEX,
Oracle的自動優化一定會用。