《oracle效能診斷藝術》學習筆記
常用如下幾種技術來實現sql優化:
改變訪問結構,修改sql語句,提示,改變執行環境,sql概要,儲存提綱,sql計畫基線。
修改sql語句
找一條等價的sql
提示(hint)
為了影響查詢優化器的決定而新增到sql語句中的提示。(查詢優化器並不總會利用它)。
查詢優化器以決策樹的形式執行,通過提示減去不需要的分支。
初始化引數提示對整個sql語句都有效。所有其他的提示僅僅對單個查詢塊起作用。僅僅對單個查詢塊起作用的提示,必須在它控制的查詢塊內之制定。
例如,你相對下面的查詢中2個表都制定訪問路徑提示,則乙個提示必須被加到主查詢上,另乙個要加到子查詢上。
改變執行環境
執行環境主要是:會話級和sql語句級。從oracle 10g起,有2張動態效能檢視提供關於執行環境的資訊:
v$sys_optimizer_env提供例項級執行環境的資訊。
v$ses_optimizer_env提供會話級執行環境的資訊。
v$sql_optimizer_env提供當前庫快取中每個子游標的執行環境資訊。
sql概要
查詢優化器被強制必須以最快的速度產生執行計畫,典型時間在秒級內,與此不同的是,自動調整優化器可以花較長的時間來產生乙個高效的執行計畫。
概念:sql概要是乙個物件,它包含可以幫助查詢優化器為乙個特定的sql語句整改帶高效的執行計畫的資訊。這些資訊包括執行環境,物件統計和對查詢優化器所做評估的修正資訊。sql概要最大的有點之一就是在不修改sql語句和會話執行環境的情況下影響查詢優化器的決定。
下圖為生成sql概要的主要步驟,執行sql語句時主要步驟。
sql概要的主要優點之一是,雖然它應用在乙個特定的sql語句上,但並不需要為此而改動sql語句本身。事實上,sql概要是儲存在資料字典中的,查詢優化器會自動選擇它們。首先,將sql 語句標準化,使其不僅不區分大小寫而且也不受空白的影響。為結果sql語句計算乙個簽名( signature )。然後,基於此簽名查詢資料字典。只要發現有相同簽名的sql概要,就檢查它以確定要優化的sql語句和此sql概要所指的sql語句是否相同。這一步很必要,因為鑑名是乙個雜湊值,因此,有可能發生雜湊衝突。如果檢測是成功的,這個sql概要將被收入執行計畫的生成過程中。
如果sql語句包含的字面量發生改變,那麼作為雜湊值的簽名也可能隨之改變。因此,sql概要會失效,因為它依賴於一條非常特定的sql語句,而這條語句可能再也不會執行。從orade 10gr2 起,為了避免這個問題,資料庫引擎能夠在標準化期問排除字面量的影響。這需要在接受sql概要時將引數force_match設定為true。
要探索文字標準化的工作機制,可以使用包dbms_sqltune的函式sqltext_to_signature。此函式要輸入兩個引數,sql_text和force_match。前者指定sql語句,後者指定使用的文字標準化的型別。下面是指令碼sqltext_to_signature.sql 輸出的摘要,展示了引數force_match對有差異但相似的sql語句生成簽名的影響。
force_match設定為false。:不區分空表和大小寫。
force_match設定為 true:空白、大小寫以及字面量均不區分。不過,如果sql語句中出現繫結變數,就不能消除字面量的影響。
儲存提綱
儲存提綱被設計用來提供穩定的執行計畫,以消除執行環境或者物件統計資訊的改變造成的影響。因此,這個特性也被稱作計畫穩定性。具體的講,儲存提綱是乙個提示的集合,更精確地說,所有這些提示強制查詢優化器為乙個給定的sql語句,穩定地產生乙個特殊的執行計畫。但實踐中,遺憾的是,即使使用儲存提綱,還是可能觀察到執行計畫的改變。儲存提綱不是總能提供乙個穩定的執行計畫,oracle 11g自身就證實了這一點,從這個版本起,不再贊成使用儲存提綱,而是推薦sql計畫基線。
sql計畫基線
可以認為sql計畫基線是儲存提綱的乙個改進版本,事實上,sql 計畫基線不僅和儲存提綱有許多相同的特性,而且也和儲存提綱一樣被設計用來提供穩定的執行計畫,以防執行環境和物件統計資訊的改變對執行計畫產生影響。此外,和儲存提綱類似,『臼也可以在不修改語句的情況下調優應用程式。注意在orade 文件中,維持執行計畫的穩定性是sql 計畫基線唯一被提及的用途.由於某些未知的原因,對於也可以在不修改應用程式的情況下使用它來更改當前執行計畫(涉及一條給定sql 語句)的用法,並未提及。
sql 計畫基線是什麼
sql計畫基線是乙個與sql語句相關聯的物件,它被設計用來影響查詢優化器產生執行計畫時的決定。具體地講,sql計畫基線主要是乙個提示的集合。基本上,sql計畫基線就是用來迫使查詢優化器為一條給定的sql語句產生個特定的、穩定的執行計畫。
sql計畫基線的優點之一是它應用到一條特定的sql語句,但在使用它的時候,sql語句自身不需要進行修改。事實上,sql計畫基線儲存在資料字典中,並且查詢優化器會自動選擇它們.首先,sql語句以傳統的方法執行換句話說,就是要杳詢優化器在沒有sql計畫基線支援的條件下產生執行計畫。然後,對sql語句進行標準化,使其不區分大小寫而且不受空白的影響。為標準化後的sql語句計算生成乙個簽名。然後,基於此簽名查詢資料字典。只要發現可接受的(信任的)並且又有相同簽名的sql計畫基線可用,就檢查它以確定要優化的sql語句和此sql計畫基線所指的sql語句是否一致。這一步十分必要,因為簽名是乙個雜湊值,因此,有可能會發生雜湊衝突。如果檢測是成功的,sql計畫基線中的提示將被放入執行計畫的生成過程裡。注意:如果有多個可用的sql計畫基線,查詢優化器會選擇代價最小的那個。
捕獲sql計畫基線
有多種方法可用來捕獲sql計畫基線。基本上,它們都是由資料庫引擎自動建立或資料庫管理員手動建立。下面的3 小節將分別介紹這3 種主要方法。
自動捕獲
當動態初始化引數optlmlzer_capture_sql_plan_baselines設定為true的時候,查詢優化器將自動建立乙個新的sql計畫基線。這個初始化引數被預設設定為false,可以在系統級和會話級修改它。當自動捕獲開啟後,查詢優化器為每條重複執行過(就是至少執行過兩次)的sql 語句儲存乙個新的sql 計畫基線。為此.它會將每條sql 語句的簽名插入乙個日誌中,以便於管理。這意味著當一條sql語句第一次執行的時候,僅把它的簽名插入日誌。然後,當第二次執行相同的語句的時候,如果不存在與此語句相對應的sql計畫基線,就新建乙個並儲存起來。如果與sql語句相對應的sql計畫基線已經存在,查詢優化器仍然會對比當前的執行計畫和基於此sql計畫基線的執行計畫。如果它們不匹配,那麼這個描述當前執行計畫的新的sql計畫基線將被儲存。然而就像你在前面見到的,不能直接使用當前的執行計畫。查詢優化器被強制使用在sql 計畫基線的輔助下產生的執行計畫。
sql優化技術整理
1.禁止使用select 需要哪些字段查哪些字段 2.使用select in 的時候,如果存在子查詢,使用exist 代替in select from class a where id in select id from class b 應使用 select from class a a where...
sql優化筆記
一 資料庫內連線原理 在sql server中,我們所常見的表與表之間的inner join,outer join都會被執行引擎根據所選的列,資料上是否有索引,所選資料的選擇性轉化為loop join,merge join,hash join這三種物理連線中的一種。1.oracle的表連線hash ...
sql 優化筆記
mysql 原文 原文這裡的引數為list,這裡我用的,分割的字串 思路就是將in中的資料處理成乙個表,進行表的關聯查詢 替換掉in select fm.id,fm.configuration id,fm.name code,fm.manufactor code,fm.type,fm.is sign...