oracle11g中SQL优化(SQL TUNING)新特性之Adaptive Cursor Sharing (ACS)
1.???ACS簡單介紹
Oracle Database 11g提供了Adaptive Cursor Sharing?(ACS)功能,以克服以往不該共享的游標被共享的可能性。ACS使用兩個新指標:sensitivity?and?bindawareness來實施該特點。
2.???ACS機制
2.1.??Adaptive Cursor Sharing Metadata:Oracle 11g也提供了三個新視圖和動態視圖V$SQL的兩個新列來同意DBA來確定優化器是否已經確定一個SQL語句為一個ACS的候選,而且,也能夠通過它們來觀察優化器分類SQL語句用以共享的運行計劃所使用的業務規則:
| 視圖 | 描寫敘述 |
| V$SQL | Two new columns are added:
|
| V$SQL_CS_HISTOGRAM | Distributes the frequency (within a three-bucket histogram) at which Oracle 11g used to decide if a SQL statement was?bind-sensitive,?including how many times a particular child cursor has been executed. |
| V$SQL_CS_SELECTIVITY | Contains information about the relative?selectivity?of a SQL statement’s?predicates, including the predicates themselves, and their high and low value ranges. These values are also termed the cursor’s?selectivity cube. |
| V$SQL_CS_STATISTICS | Lists the statistics of whether and/or how often an Adaptive Cursor has been shared. The?PEEKED?column will display a value of?Y(es) if the bind set had been used to build the Adaptive Cursor. |
表-1 ACS 視圖
2.2.??Bind Sensitivity:當帶有綁定變量的SQL語句首次被解析時,在優化器窺探了綁定變量的值,并確定了語句謂詞的相關選擇率后。把該游標標記為?bind-sensitive(綁定敏感的)。期間也保留了這些敏感測量值,以便今后帶有相同變量、不同值的相同語句再次運行時進行比較,看一個已經存在的運行計劃能否被新綁定變量值的語句利用。
2.3.??Bind Awareness:一旦一個SQL語句的游標被標為?bind-sensitive,優化器也能夠確定游標是bind-aware。通過檢查隨后運行的相同SQL語句綁定變量的值和全部匹配計劃已被捕獲的綁定變量的值,優化器完畢這個步驟。假設優化器確定該語句能利用已存在的計劃,那么,僅僅須要更新游標運行柱狀圖來反應語句的運行就可以。另外,假設綁定變量值足夠不同。優化器或許決定創建一個新的子游標和運行計劃。一旦這些發生,Oracle11g也把子游標的相關選擇率存儲到ACS元數據中。在游標隨后的運行過程中。優化器比較存在的統計選擇性數據和游標近期運行的統計數據,假設觀察到大多數運行使用近似相同的選擇性范圍。那么,游標將會被標記為bind-aware。
當查詢以一套超出一個已存在的bind-aware的游標綁定變量的選擇率范圍界限的不同的綁定變量值被運行時會發生什么呢?在該語句的硬解析期間,優化器或許只決定擴展那個游標的選擇率范圍來包括新的變量值。通過產生一個合并兩套綁定變量值的新游來做到這點。可見在必要的時候,也不過添加了新游標。Oracle11g中。ACS特點默認被開啟。且全然獨立于CURSOR_SHARING參數。
2.4.??對SQLPlan Management (SPM)影響:最后。假設你了解古Oracle11g的SPM特點,你可能想知道ACS和SPM是否會相互影響,以下做一些簡短的總結:
假設初始化參數OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES已被設置為TRUE來開啟自己主動計劃捕獲,那么,帶綁定變量的一個SQL語句將被標作相應的能用和可接受的運行計劃。
假設相同語句的第二個運行計劃被創建——對ACS特點來說這并不新奇——那么。計劃只被添加到語句的計劃歷史里,但并能被立馬使用,由于SPM要求新運行計劃首先被驗證為一個較好的計劃。
不幸的是。這意味著一個好的計劃或許被忽視掉,哪怕是其游標的選擇性范圍可能會導致一個較好的性能。繞過該問題的一個非常好的辦法是保持自己主動計劃捕獲為默認設置False,接著把全部library cahce里的子游標都捕獲到SMB里去。這將會迫使ACS產生的游標的全部計劃都被標為SQL PLAN BASELINES。
3.???限制
Oracle11gR2為止,ACS特性存在下面限制(當下面場景出現時,會導致ACS不會把游標標記為bind sensitive):
?? 擴展游標共享被關閉;
?? 查詢中沒綁定變量。
?? 某些參數被設置(比如:綁定變量窺探被置為flase);
?? 語句正使用并行查詢時;
?? 語句使用了hints。
?? Outlines正被使用;
?? 查詢為遞歸查詢;
?? 綁定變量數超過14;
4.???關閉及開啟
?? ACS默認情況下是開啟的。為了關閉ACS,我們須要改動下面三個參數:
alter system set"_optimizer_extended_cursor_sharing_rel"=none;
?altersystem set "_optimizer_extended_cursor_sharing"=none;
?altersystem set "_optimizer_adaptive_cursor_sharing"=false;
?? 為了開啟ACS,我們須要改動下面四個參數:
_optim_peek_user_binds=true(一定要開啟綁定變量窺視)_optimizer_adaptive_cursor_sharing=TRUE(下面三個參數默認開啟ACS)_optimizer_extended_cursor_sharing=UDO
_optimizer_extended_cursor_sharing_rel=SIMPLE
5.???注意:
?? 相關hint:Oracle11g中有個新的 hint。當使用此hint時,即使把ACS特性關掉,ACS特性在語句級依舊會生效,該hint的語法為:/*+ BIND_AWARE*/。
?? 關于Outlines:在Outlines存在的場景下,不管在系統級啟用還是語句級通過hint啟用,ACS都會失效。
6.???結論:
Oracle Database 11g的新特點ACS功能為帶綁定變量的SQL語句運行計劃高效共享提供了一個簡單的方法。因為僅僅有當綁定變量值選擇率必要時,ACS也會產生一個新的運行計劃。因此,共享游標的數目會保持最小。
?
總結
以上是生活随笔為你收集整理的oracle11g中SQL优化(SQL TUNING)新特性之Adaptive Cursor Sharing (ACS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试面试必备的一些基础理论概念
- 下一篇: 51nod汽油补给