Oracle常見hint(leading)
Hint直接跟在select/update/merge/insert後,否則不起作用。結構:/*+ */
Parallel(4): 由於併發採用生產者-消費者模式,這裡表示每組生產者/消費者有4個slave。實際程式數量有N*4+1個,通常N=2。 1是QC, Query Coordinator。
Append: 常見於insert語句,指令Oracle採用direct-path load。
Leading(): 指示Oracle在執行join(hash join, nested loop join, merge join)時的連線順序。
- select /*+ leading(t1) */
- t1.ename, t2.dname
- from emp t1, dept t2
- where t1.deptno=t2.deptno
- ----------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- ----------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | | | 18 (100)| |
- | 1 | NESTED LOOPS | | | | | |
- | 2 | NESTED LOOPS | | 15 | 360 | 18 (0)| 00:00:01 |
- | 3 | TABLE ACCESS FULL | EMP | 15 | 135 | 3 (0)| 00:00:01 |
- |* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| |
- | 5 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 15 | 1 (0)| 00:00:01 |
- ----------------------------------------------------------------------------------------
- select /*+ leading(t2) */
- t1.ename, t2.dname
- from emp t1, dept t2
- where t1.deptno=t2.deptno;
- -----------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
- -----------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | | | | 236 (100)| |
- |* 1 | HASH JOIN | | 15 | 360 | 2640K| 236 (1)| 00:00:03 |
- | 2 | TABLE ACCESS FULL| DEPT | 100K| 1465K| | 103 (1)| 00:00:02 |
- | 3 | TABLE ACCESS FULL| EMP | 15 | 135 | | 3 (0)| 00:00:01 |
- -----------------------------------------------------------------------------------
在這裡,也可以寫成leading(t1,t2)或者leading(t2,t1)。
假如有多個互相矛盾的leading存在,Oracle將無視所有的leading。 Ordered Hint的優先順序高於leading。
Ordered: 指示Oracle按照結果集在SQL中出線的順序做連線。Oracle無法選擇連線順序。Oracle官方建議使用leading,而不是ordered。例子:
- SELECT /*+ ORDERED */ o.order_id, c.customer_id, l.unit_price * l.quantity
- FROM customers c, order_items l, orders o
- WHERE c.cust_last_name = 'Taylor'
- AND o.customer_id = c.customer_id
- AND o.order_id = l.order_id;
Merge(): 指示Oracle使用View Merge,前提是可以做View Merge,Oracle。如:
- 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
- ORDER BY e1.last_name;
Result_Cache: 使用Query Result cache特性,將SQL結果集放入Shared pool的Result Cache中。注意SQL中的函式必須是deterministic的,比如sysdate就不是。
Index(): 可以寫0,1,N個index。假如0個,Oracle考察每個可用索引的成本,選擇最小的。假如N個,Oracle考察列出的每個索引的成本,選擇最小的。0或N個時,Oracle也可能使用多個索引,再將結果集合並。1個時,Oracle只考慮該索引,也不會使用全表掃描。例子:
- SELECT /*+ INDEX (employees emp_department_ix)*/ employee_id, department_id
- FROM employees
- WHERE department_id > 50;
- SELECT /*+ FULL(e) */ employee_id, last_name
- FROM hr.employees e
- WHERE last_name LIKE :b1;
Use_hash: 使用雜湊連線。請看例子,在這裡,連線順序並不是l在前,h在後。Oracle會自動根據成本來選擇連線順序。需要Leading()來指定。該情況適用於use_nl和use_merge。
- SELECT /*+ USE_HASH(l h) */ *
- FROM orders h, order_items l
- WHERE l.order_id = h.order_id
- AND l.order_id > 2400;
Use_NL: 使用巢狀迴圈連線。
- SELECT /*+ USE_NL(l h) */ h.customer_id, l.unit_price * l.quantity
- FROM orders h, order_items l
- WHERE l.order_id = h.order_id;
Use_Merge: 使用Merge sort join。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29209863/viewspace-2128173/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle常見hintOracle
- oracle hint_leadingOracle
- 常見Oracle HINT的用法Oracle
- Oracle中常見的Hint(一)Oracle
- SQL hint中的ORDER與Leading(zt)SQL
- oracle經常使用到的hintOracle
- oracle hintOracle
- ORACLE 常見等待事件Oracle事件
- oracle 常見錯誤Oracle
- oracle常見等待事件Oracle事件
- ORACLE 部分HINTOracle
- oracle hint (續)Oracle
- Oracle Hint 精華Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(五)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(四)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(三)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(二)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(一)Oracle
- Oracle leading vs. ordered hintsOracle
- Oracle常見UNDO等待事件Oracle事件
- ORACLE 常見故障恢復Oracle
- oracle常見身份驗證Oracle
- Oracle 常見的等待事件Oracle事件
- Oracle redo log 常見操作Oracle Redo
- ORACLE常見問題(zt)Oracle
- oracle之hint概述Oracle
- oracle hint簡述Oracle
- oracle hint (續-0)Oracle
- oracle hint_no_indexOracleIndex
- Oracle Hint 精華文章Oracle
- 常用的Oracle HintOracle
- Oracle Hint 詳解Oracle
- Oracle Hint的用法Oracle
- oracle常見異常等待——latch處理思路Oracle
- oracle hint之hint_index_ffs,index_joinOracleIndex
- Oracle常見問題一千問Oracle
- 【等待事件】ORACLE常見等待事件事件Oracle
- Oracle常見數字函式Oracle函式