官术网_书友最值得收藏!

6.3 游標共享

游標是否共享是通過參數cursor_sharing來控制的。下面分別說明這個參數幾種取值的含義。

·EXACT:只有當發布的SQL語句與緩存中的語句完全相同時才用已有的執行計劃。

·FORCE:如果SQL語句是字面量,則迫使優化器始終使用已有的執行計劃。(無論已有的執行計劃是不是最佳的。)優化器將把SQL語句所有字面常量替換為系統產生的綁定變量,并檢查是否存在一個以前產生的共享游標用于修改后的語句。

·SIMILAR:如果SQL語句是字面量,則只有當已有的執行計劃是最佳時才使用它,如果已有執行計劃不是最佳,則重新對這個SQL語句進行分析以制定最佳執行計劃。首先將字面變量替換為綁定變量,然后窺視綁定變量的值。如果有必要,將對該語句每次單獨的分析調用中輸入值進行優化。該參數指定Oracle在存在柱狀圖信息時,對于不同的變量值,重新解析,從而利用柱狀圖更為精確地指定SQL執行計劃。即當存在柱狀圖時,SIMILAR的表現和EXACT一樣;當不存在柱狀圖時,SIMILAR的表現和FORCE相同。

下面通過一個例子說明。


create table t1 as select rownum id ,object_name name from sys.dba_objects;

show parameter cursor_sharing=> FORCE

select * from t1 where id=1;

selectsql_text,sql_id,version_count,executions
fromv$sqlarea
wheresql_text like 'select * from t1%';
SQL_TEXT                                 SQL_ID        VERSION_COUNT EXECUTIONS
---------------------------------------- ------------- ------------- ----------
select * from t1 where id=:"SYS_B_0"     6800d8tpghk0c             1          1
//在CURSOR_SHARING為FORCE的情況下,Oracle強制使用了綁定變量,甚至直接改寫了SQL

alter session set cursor_sharing=EXACT;

grant select on t1 to sys;
//通過這種方式淘汰了已經生成的執行計劃

select * from t1 where id=1;

select sql_text,sql_id,version_count,executions
from v$sqlarea
where sql_text like 'select * from t1%';
SQL_TEXT                                 SQL_ID        VERSION_COUNT EXECUTIONS
---------------------------------------- ------------- ------------- ----------
select * from t1 where id=1              5ag8kthgnvjk2             1          1
/*
再次執行上面的SQL,可見在CURSOR_SHARING=EXACT的情況下,絕對精確匹配文本,沒有使用綁定變量
*/

主站蜘蛛池模板: 邯郸市| 福清市| 大同市| 曲沃县| 大渡口区| 禹州市| 芒康县| 张家川| 遵化市| 习水县| 江门市| 清丰县| 塘沽区| 壤塘县| 永春县| 石林| 屯留县| 陕西省| 安顺市| 津南区| 永新县| 宜良县| 广平县| 禹州市| 竹溪县| 濮阳市| 安顺市| 九寨沟县| 紫阳县| 通化市| 新民市| 蓝田县| 醴陵市| 昭苏县| 勐海县| 遵义市| 泰和县| 达州市| 乳源| 包头市| 长宁区|