oracle11g中SQL优化(SQL TUNING)新特性之Adaptive Cursor Sharing (ACS)
1.???ACS簡單介紹
Oracle Database 11g提供了Adaptive Cursor Sharing?(ACS)功能,以克服以往不該共享的游標(biāo)被共享的可能性。ACS使用兩個新指標(biāo):sensitivity?and?bindawareness來實施該特點。
2.???ACS機制
2.1.??Adaptive Cursor Sharing Metadata:Oracle 11g也提供了三個新視圖和動態(tài)視圖V$SQL的兩個新列來同意DBA來確定優(yōu)化器是否已經(jīng)確定一個SQL語句為一個ACS的候選,而且,也能夠通過它們來觀察優(yōu)化器分類SQL語句用以共享的運行計劃所使用的業(yè)務(wù)規(guī)則:
| 視圖 | 描寫敘述 |
| 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:當(dāng)帶有綁定變量的SQL語句首次被解析時,在優(yōu)化器窺探了綁定變量的值,并確定了語句謂詞的相關(guān)選擇率后。把該游標(biāo)標(biāo)記為?bind-sensitive(綁定敏感的)。期間也保留了這些敏感測量值,以便今后帶有相同變量、不同值的相同語句再次運行時進(jìn)行比較,看一個已經(jīng)存在的運行計劃能否被新綁定變量值的語句利用。
2.3.??Bind Awareness:一旦一個SQL語句的游標(biāo)被標(biāo)為?bind-sensitive,優(yōu)化器也能夠確定游標(biāo)是bind-aware。通過檢查隨后運行的相同SQL語句綁定變量的值和全部匹配計劃已被捕獲的綁定變量的值,優(yōu)化器完畢這個步驟。假設(shè)優(yōu)化器確定該語句能利用已存在的計劃,那么,僅僅須要更新游標(biāo)運行柱狀圖來反應(yīng)語句的運行就可以。另外,假設(shè)綁定變量值足夠不同。優(yōu)化器或許決定創(chuàng)建一個新的子游標(biāo)和運行計劃。一旦這些發(fā)生,Oracle11g也把子游標(biāo)的相關(guān)選擇率存儲到ACS元數(shù)據(jù)中。在游標(biāo)隨后的運行過程中。優(yōu)化器比較存在的統(tǒng)計選擇性數(shù)據(jù)和游標(biāo)近期運行的統(tǒng)計數(shù)據(jù),假設(shè)觀察到大多數(shù)運行使用近似相同的選擇性范圍。那么,游標(biāo)將會被標(biāo)記為bind-aware。
當(dāng)查詢以一套超出一個已存在的bind-aware的游標(biāo)綁定變量的選擇率范圍界限的不同的綁定變量值被運行時會發(fā)生什么呢?在該語句的硬解析期間,優(yōu)化器或許只決定擴展那個游標(biāo)的選擇率范圍來包括新的變量值。通過產(chǎn)生一個合并兩套綁定變量值的新游來做到這點。可見在必要的時候,也不過添加了新游標(biāo)。Oracle11g中。ACS特點默認(rèn)被開啟。且全然獨立于CURSOR_SHARING參數(shù)。
2.4.??對SQLPlan Management (SPM)影響:最后。假設(shè)你了解古Oracle11g的SPM特點,你可能想知道ACS和SPM是否會相互影響,以下做一些簡短的總結(jié):
假設(shè)初始化參數(shù)OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES已被設(shè)置為TRUE來開啟自己主動計劃捕獲,那么,帶綁定變量的一個SQL語句將被標(biāo)作相應(yīng)的能用和可接受的運行計劃。
假設(shè)相同語句的第二個運行計劃被創(chuàng)建——對ACS特點來說這并不新奇——那么。計劃只被添加到語句的計劃歷史里,但并能被立馬使用,由于SPM要求新運行計劃首先被驗證為一個較好的計劃。
不幸的是。這意味著一個好的計劃或許被忽視掉,哪怕是其游標(biāo)的選擇性范圍可能會導(dǎo)致一個較好的性能。繞過該問題的一個非常好的辦法是保持自己主動計劃捕獲為默認(rèn)設(shè)置False,接著把全部library cahce里的子游標(biāo)都捕獲到SMB里去。這將會迫使ACS產(chǎn)生的游標(biāo)的全部計劃都被標(biāo)為SQL PLAN BASELINES。
3.???限制
Oracle11gR2為止,ACS特性存在下面限制(當(dāng)下面場景出現(xiàn)時,會導(dǎo)致ACS不會把游標(biāo)標(biāo)記為bind sensitive):
?? 擴展游標(biāo)共享被關(guān)閉;
?? 查詢中沒綁定變量。
?? 某些參數(shù)被設(shè)置(比如:綁定變量窺探被置為flase);
?? 語句正使用并行查詢時;
?? 語句使用了hints。
?? Outlines正被使用;
?? 查詢?yōu)檫f歸查詢;
?? 綁定變量數(shù)超過14;
4.???關(guān)閉及開啟
?? ACS默認(rèn)情況下是開啟的。為了關(guān)閉ACS,我們須要改動下面三個參數(shù):
alter system set"_optimizer_extended_cursor_sharing_rel"=none;
?altersystem set "_optimizer_extended_cursor_sharing"=none;
?altersystem set "_optimizer_adaptive_cursor_sharing"=false;
?? 為了開啟ACS,我們須要改動下面四個參數(shù):
_optim_peek_user_binds=true(一定要開啟綁定變量窺視)_optimizer_adaptive_cursor_sharing=TRUE(下面三個參數(shù)默認(rèn)開啟ACS)_optimizer_extended_cursor_sharing=UDO
_optimizer_extended_cursor_sharing_rel=SIMPLE
5.???注意:
?? 相關(guān)hint:Oracle11g中有個新的 hint。當(dāng)使用此hint時,即使把ACS特性關(guān)掉,ACS特性在語句級依舊會生效,該hint的語法為:/*+ BIND_AWARE*/。
?? 關(guān)于Outlines:在Outlines存在的場景下,不管在系統(tǒng)級啟用還是語句級通過hint啟用,ACS都會失效。
6.???結(jié)論:
Oracle Database 11g的新特點ACS功能為帶綁定變量的SQL語句運行計劃高效共享提供了一個簡單的方法。因為僅僅有當(dāng)綁定變量值選擇率必要時,ACS也會產(chǎn)生一個新的運行計劃。因此,共享游標(biāo)的數(shù)目會保持最小。
?
總結(jié)
以上是生活随笔為你收集整理的oracle11g中SQL优化(SQL TUNING)新特性之Adaptive Cursor Sharing (ACS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试面试必备的一些基础理论概念
- 下一篇: mysql之 explain、optim