Oracle Hint
Oracle Hints是一種機制,用來告訴優化器按照我們的告訴它的方式生成執行計劃,它允許使用者在SQL語句中插入相關的文法,進而影響SQL的執行方式。
Hint的作用
※ 調整目标SQL使用的優化器類型
※ 調整優化器的優化目标
※ 調整表的通路路徑
※ 調整表的連接配接類型
※ 調整表的連接配接順序
※ 提高語句的并行程度

Hint的弊端
▓ Hint是比較"暴力"的一種解決方式,不是很優雅。需要開發人員手工修改代碼。
▓ Hint不會去适應新的變化,隻是在現有的基礎上産生更優的執行計劃。
▓ Hint随着資料庫版本的變化,可能會有一些差異、甚至廢棄的情況。
Oracle stored outline
Oracle stored outline(存儲提綱)是最早的基于提示來控制SQL執行計劃的機制,也是9i以及之前版本唯一可以用來穩定和控制SQL執行計劃的工具。主要的作用是用來保持固定sql語句的執行計劃,讓sql語句的執行計劃在資料庫環境變更(統計資訊、優化器參數、表結果變更等)後還能保持原來的執行計劃。
使 用 場 景
① 避免SQL的執行計劃在統計資料不準确的情況(如未能及時收集表或索引的統計資訊)下導緻變化進而引起的性能降低。
② 避免容易因為Bind Peeking導緻SQL執行計劃變差進而引起的性能降低。
③ 避免大規模分布實施的應用出現資料庫版本、配置等差別引起的優化器産生不同的執行計劃。
注意事項
從10g以後,outline基本已經被Oracle廢棄并且不在維護。
隻有設定use_stored_outlines參數後才能啟用outline。
建立outline需要create any outline or execute_catelog_role權限 。
SQL Profile
SQL Profile是stored outline的進化版,是為目标SQL提供除了統計資訊之外的其他資訊,比如運作環境、更準确的執行路徑等,以幫助優化器為SQL語句選擇更合适的執行計劃。
WELCOME TO JION US
優點
Ⅰ、更容易生成、更改和控制
Ⅱ、适用範圍廣
Ⅲ、在不改變目标SQL文本的情況下達到穩定執行計劃的效果
Automatic類型的SQL Profile
Automatic類型的SQL Profile其實是目标SQL一些額外的調整資訊,這些資訊存儲在資料字典中。Oracle會使用類似于動态采樣的方法來支援Automatic類型的SQL Profile,在生成執行計劃的時候Oracle會将調整資訊同原SQL的相關統計資訊等内容一起作用進而得到最新的執行計劃
Manual類型的SQL Profile
Manual類型SQL Profile的本質是一堆來源Outline Data部分的Hint組合,可以在不改變目标SQL文本的情況下調整其執行計劃
特 殊 說 明
SQL Profile 實際上隻是一種亡羊補牢、被動的技術手段,應用在那些執行計劃已經發生了不好的變更的 SQL上,即當我們發現這些SQL的執行計劃已經出了問題時通過建立SQL Pofle來糾正、穩定這些SQL的執行計劃。也就是說,即便通過建立SQLProfile解決了目标SQL執行計劃變更的問題,依然不能保證系統後續執行的 SQL 的執行計劃就不再發生不好的變更。
SPM(SQL Plan Management)
SPM 是一種主動的穩定執行計劃的手段,能夠保證隻有被驗證過的執行計劃才會被啟用。SPM既能夠主動地穩定執行計劃,又保留了繼續使用新的執行效率可能更高的執行計劃的機會。SPM啟動後,每個SQL的所有執行計劃都有對應的SQL Plan Baseline,可以通過DBA_SQL_PLAN_BASELINE檢視。隻有DBA_SQL_PLAN_BASELINE表中ENABLE和ACCEPTED列的值均為’YES’的SQL Plan Baseline對應的執行計劃才會被Oracle啟用。
獲 取 方 法
自動捕獲(Automatic Initial Plan Capture)
❶設定OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES = Ture
❷Oracle自動監控執行兩次以上的SQL語句,将執行計劃記入Plan History。
❸生成的第一個執行計劃被标記為ENABLED并且是ACCEPTED,後續的執行計劃會被标記為ENABLED但不是ACCEPTED。
❹後續如果關閉了自動捕捉,針對存在baseline的SQL,仍舊會有新的PLAN生成,新的Plan仍會進入Plan History,标記為ENABLED但不是ACCEPTED。
手動導入(Manual Plan Capture)
Oracle支援通過DBMS_SPM包手動管理SPM,可以将SQL執行計劃從高速緩存或現有的SQL優化集中加載到SPM。