1、FIRST_ROWS
?? 指示優化器盡可能快地返回前n行記錄,提高響應速度。如果沒有指定參數,則返回第一行。該提示對Update和Insert無效,對包含塊操作的select語句無效,如排序和group。 這樣的語句不能優化最佳響應時間,因為Oracle在返回第一行之前,必須獲得所有的記錄。如果在這種情況下使用了該提示,優化器會優化最佳吞吐量(相當于ALL_ROWS提示)。
?
2、FULL
?? 指示優化器執行全表掃描,即使有索引,也不會走索引。
??
???
SELECT
?
/**/
/*
+?FULL(e)?
*/
?employee_id,?last_name
??????
FROM
?hr.employees?e?
WHERE
?last_name?
LIKE
?:b1;
??
?? 注意:如果表有別名,則必須使用別名。并且即使表加上了schema名稱,在提示中也不能指定schema名稱。
?
3、HASH
?? 指示優化器使用Hash掃描表,只適用于表簇中的表。
?
4、INDEX
?? 指示優化器適用Index掃描表,適用于函數、域、B樹、位圖和位圖聯合索引。
?? Index提示遵循以下規范:
?? a、如果Index提示指定單個的索引,那么數據庫執行該索引上的掃描,優化器不會執行全表掃描或者表上的其他索引。
?? b、對于指定了多個索引的組合的Index提示,Oracle推薦使用INDEX_COMBINE而不是INDEX提示,因為它更加通用,如果Index提示指定了index列表,那么優化器會考慮走每個索引的代碼,并從中選擇代價最小的一條索引,如果掃描多個index的代價最小,那么優化器會掃描該個索引列表。優化器不會走全表掃描或者沒有在index列表上的索引。
?? c、如果Index提示沒有指定Index,優化器會評估掃描每個Index的代價,并選擇代價最小的Index,如果組合Index代價最小,那么優化器會選擇掃描多個索引,并合并結果集。優化器不會走全表掃描。
?
???
SELECT
?
/**/
/*
+?INDEX?(employees?emp_department_ix)
*/
??employee_id,?department_id
????
FROM
?employees?
WHERE
?department_id?
>
?
50
;
?
5、INDEX_ASC
?? 按索引值的升序方向掃描索引,其他參數與INDEX 提示完全一樣。
?
6、INDEX_COMBINE
?? 聯合索引提示。索引規則與INDEX提示一樣。
??
???
SELECT
?
/**/
/*
+?INDEX_COMBINE(e?emp_manager_ix?emp_department_ix)?
*/
?
*
FROM
?employees?e
WHERE
?manager_id?
=
?
108
OR
?department_id?
=
?
110
;
?
7、INDEX_DESC
? 降序INDEX提示。
?
SELECT
?
/**/
/*
+?INDEX_DESC(e?emp_name_ix)?
*/
?
*
FROM
?employees?e;
?
8、INDEX_FFS
? 指示優化器執行快速全索引掃描,而不是全表掃描。
?
SELECT
?
/**/
/*
+?INDEX_FFS(e?emp_name_ix)?
*/
?first_name
FROM
?employees?e;
?
9、INDEX_JOIN
??以INDEX JOIN的方式掃描,必須存在足夠少的INDEX,這些索引包含著查詢中所有的列。
?
SELECT
?
/**/
/*
+?INDEX_JOIN(e?emp_manager_ix?emp_department_ix)?
*/
?department_id
FROM
?employees?e?
WHERE
?manager_id?
<
?
110
?
AND
?department_id?
<
?
50
;
?
10、INDEX_SS
? 索引跳躍掃描提示。
?
11、LEADING
? 指定特定的表放在執行計劃的前面,它比ORDERED提示更加通用。
? 如果因為Join路線的依賴關系而不能首先被Join,提示就會被忽略;如果指定了兩個或者多個沖突的LEADING提示,則他們都會被忽略;如果指定了ORDERED提示,那么LEADING就會被忽略。
?
12、MERGE
??將視圖合并到查詢。
? 如果視圖查詢語句包含GROUP BY子句或者SELECT語句中用到了 DISTINCT,那么優化器能夠將視圖合并到查詢語句中,合成的合并也能夠合并IN子查詢,如果IN子查詢沒有關聯。
?
??
SELECT
?
/**/
/*
+?MERGE(v)?
*/
?e1.last_name,?e1.salary,?v.avg_salary
FROM
?employees?e1,
(
SELECT
?department_id,?
avg
(salary)?avg_salary
FROM
?employees?e2
GROUP
?
BY
?department_id)?v
WHERE
?e1.department_id?
=
?v.department_id?
AND
?e1.salary?
>
?v.avg_salary;
?
13、NOAPPEND
?? 在并行模式中使用常規插入方法。
?
14、NOCACHE
?
15、NO_EXPAND
?
16、NO_FACT
?
17、NO_INDEX
?
18、NO_INDEX_SS
?
19、NO_MERGE
?
20、NO_PARALLEL
?? 覆蓋了使用DDL語言創建或者更改table的PARALLEL參數的設置。
?
21、NO_PARALLEL_INDEX
?? 覆蓋了使用DDL語言創建或者更改index的PARALLEL參數的設置。
?
22、NO_PUSH_PRED
??
23、NO_PUSH_SUBQ
?
24、NO_PX_JOIN_FILTER
??? 阻止優化器使用并行聯合位圖過濾器
?
25、NO_REWRITE
??? 使查詢重寫失效
?
26、NO_QUERY_TRANSFORMATION
??? 跳過所有查詢轉換,包括但不限于:OR-expansion、視圖合并、無嵌套子查詢、星型轉換和物化視圖重寫。
?
27、NO_STAR_TRANSFORMATION
?
28、NO_UNNEST
?
29、NO_USE_HASH
?
30、ORDERED
?? 指示優化器按照FROM子句出現的表順序join表。Oracle推薦使用LEADING提示。
?
31、PARALLEL
?? 指示優化器使用指定數目的服務器去執行并行操作,包括SELECT、INSERT、MERGE、UPDATE和DELETE部分的語句和表掃描部分都可使用。
?? 注意:如果發生sort或者group,那么服務器的數量應該是提示指定的兩倍。
?? 如果任何并行都被禁止,那么提示就會被忽略。
?? 如果指定了DEFAULT或者沒有指定任何值,那么查詢器就會去檢查初始參數的設置來決定并行度。
?? 臨時表上的該提示將會被忽略。
?
32、PARALLEL_INDEX
?? 為分區索引指定并行索引掃描的數量。示例:
??? SELECT /*+ PARALLEL_INDEX(table1, index1, 3) */
?
33、PQ_DISTRIBUTE
?
34、PUSH_PRED
?
35、PUSH_SUBQ
?
36、REWRITE
??? 對物化視圖使用查詢重寫。