【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(二)

Attack_on_Jager發表於2021-02-12

說明 

1.整理了一些本人平時SQL 調優中常用到的一些Hint,方便大家參考

2.Hint相關文章地址:

Oracle Hint之概念與用法: http://blog.itpub.net/69992972/viewspace-2756965/

Oracle Hint之常用Hint功能概述(一): http://blog.itpub.net/69992972/viewspace-2757087/

Oracle Hint之常用Hint功能概述(二): http://blog.itpub.net/69992972/viewspace-2757182/

Oracle Hint之常用Hint功能概述(三): http://blog.itpub.net/69992972/viewspace-2757238/

Oracle Hint之常用Hint功能概述(四): http://blog.itpub.net/69992972/viewspace-2757242/

Oracle Hint之常用Hint功能概述(五): http://blog.itpub.net/69992972/viewspace-2757273/


查詢轉換Hint

Hint

功能概述

舉例

/*+   no_query_transformation */

該hint讓最佳化器跳過所有查詢轉換,包括但不限於OR操作轉換、檢視合併、子查詢非巢狀,星形轉換和物化檢視重寫

SELECT /*+ NO_QUERY_TRANSFORMATION */ employee_id, last_name FROM (SELECT * FROM emp e) v WHERE v.last_name = 'James';

/*+ no_expand */

該hint讓最佳化器不要對WHERE子句中具有OR條件或IN列表的查詢使用union   all的方式。通常,最佳化器會考慮使用union all,並在確定成本低於不使用它的情況下使用此方法


/*+   expand_table(tab) */

該hint讓最佳化器在不考慮成本的情況下,對目標SQL中的目標表進行表擴充套件


/*+   no_expand_table(tab) */

不讓最佳化器對目標SQL中的目標表進行表擴充套件


/*+ unnest */

該hint讓最佳化器取消巢狀並將子查詢的主體合併到包含它的查詢塊的主體中,從而使最佳化器在評估訪問路徑和聯接時將它們一起考慮(將子查詢和主查詢合併)。

在取消巢狀子查詢之前,最佳化器首先驗證該語句是否有效。然後,該語句必須透過啟發式和查詢最佳化測試。UNNEST提示指示最佳化器僅檢查子查詢塊的有效性。如果子查詢塊有效,那麼將啟用子查詢取消巢狀,而無需檢查啟發式方法或成本。


/*+ no_unnest */

關閉unnest


/*+   star_transformation */

該hint讓最佳化器強制對星型模型的訪問轉換為子查詢,並按bitmap索引進行訪問

SELECT /*+ STAR_TRANSFORMATION */ s.time_id, s.prod_id, s.channel_id FROM sales s, times t, products p, channels c WHERE s.time_id = t.time_id AND s.prod_id = p.prod_id AND s.channel_id = c.channel_id AND c.channel_desc = 'Tele Sales';

/*+ fact(tab) */

與star_transformation配合,指定某個表為事實表(fact table)


/*+ no_fact(tab)   */

與star_transformation配合,取消某個表作為事實表(fact table)


/*+ rewrite */

該hint讓最佳化器儘可能在不考慮成本的情況下根據物化檢視重寫查詢。在有或沒有檢視列表的情況下使用REWRITE提示。如果將REWRITE與檢視列表一起使用,並且該列表包含合格的物化檢視,則Oracle會使用該檢視,而不考慮其成本。

Oracle不在列表之外考慮檢視。如果未指定檢視列表,則Oracle會搜尋合格的物化檢視並始終使用該檢視,而不考慮最終計劃的成本


/*+ no_rewrite */

關閉rewrite


/*+ merge */

如果檢視的查詢塊在SELECT列表中包含GROUP BY子句或DISTINCT運算子,則只有啟用了複雜的檢視合併後,最佳化器才能將檢視合併到訪問語句中。如果子查詢不相關,則也可以使用複雜合併將IN子查詢合併到訪問語句中

SELECT /*+ MERGE(v) */ e1.last_name, e1.salary, v.avg_salary FROM emp e1,  (SELECT department_id, avg(salary) avg_salary FROM emp e2 GROUP BY department_id) v WHERE e1.department_id = v.department_id AND e1.salary > v.avg_salary ORDER BY e1.last_name;

/*+ no_merge */

阻止獎複雜檢視和與呼叫該檢視的語句合併


/*+ push_pred */

該hint讓指示最佳化器把聯接謂詞推入檢視(讓謂詞成為檢視的一部分先執行)

SELECT /*+ NO_MERGE(v) PUSH_PRED(v) */ * FROM emp e, (SELECT manager_id FROM emp) v WHERE e.manager_id = v.manager_id(+) AND   e.employee_id = 100;

/*+ no_push_pred   */

不讓最佳化器把聯接謂詞推入檢視


/*+ push_subq */

該hint讓最佳化器在執行計劃的最開始的步驟中先執行未合併的子查詢。 通常,未合併的子查詢將作為執行計劃中的最後一步執行。如果子查詢相對便宜,並且大大減少了行數,那麼更早地評估子查詢可以提高效能。

如果子查詢應用於遠端表或使用合併聯接進行聯接的子查詢,則此hint無效


/*+ no_push_subq   */

讓最佳化器最後執行目標SQL中不能做子查詢展開的子查詢



並行Hint

Hint

功能概述

舉例

/*+ parallel */

該hint讓最佳化器將指定數量的併發伺服器用於並行操作。   此提示將覆蓋PARALLEL_DEGREE_POLICY初始化引數的值。它適用於SELECT、INSERT、MERGE、UPDATE和DELETE語句,以及表掃描部分。如果違反了任何並行限制,則忽略hint

SELECT /*+ PARALLEL(4) */ last_name FROM emp;

/*+ no_parallel   */

取消並行


/*+   parallel_index(tab idx_name, n) */

該hint讓最佳化器使用指定數量的併發伺服器來並行化分割槽範圍的索引範圍掃描、完整掃描和快速完整掃描。

整數值表示指定索引的並行度。指定DEFAULT或不指定任何值表示查詢協調器應檢查初始化引數的設定以確定預設的並行度


/*+ no_parallel_index(tab   idx_name) */

該hint不讓最佳化器使用併發伺服器來並行化分割槽範圍的索引範圍掃描、完整掃描和快速完整掃描。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992972/viewspace-2757182/,如需轉載,請註明出處,否則將追究法律責任。

相關文章