- 數據庫高效優化:架構、規范與SQL技巧
- 馬立和 高振嬌 韓鋒
- 565字
- 2020-08-03 16:49:23
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的情況下,絕對精確匹配文本,沒有使用綁定變量 */
推薦閱讀
- 企業數字化創新引擎:企業級PaaS平臺HZERO
- 數據挖掘原理與實踐
- Access 2016數據庫教程(微課版·第2版)
- 數據之巔:數據的本質與未來
- Voice Application Development for Android
- 區塊鏈:看得見的信任
- 3D計算機視覺:原理、算法及應用
- Sybase數據庫在UNIX、Windows上的實施和管理
- 數據架構與商業智能
- 數據挖掘原理與SPSS Clementine應用寶典
- Oracle 12c云數據庫備份與恢復技術
- MATLAB Graphics and Data Visualization Cookbook
- Hadoop大數據開發案例教程與項目實戰(在線實驗+在線自測)
- 信息融合中估計算法的性能評估
- 算法設計與分析