繫結變數
在開發中,如果不使用繫結變數,會給系統帶來災難性的後果,因為我們寫的每一條sql都會經過解析,但是這個過程很佔用cpu,解析過得sql 會放在共享池的Library Cache裡,如果不使用繫結變數的話,每一條sql都會解析一次(硬解析),不會被重複使用,這樣會大大降低oracle的效能。使用繫結變數,sql語句只會解析一次(軟解析)。
下面透過列子說明使用和不使用繫結變數給系統帶來的效能問題:
SQL> select * from v$version where rownum<2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
SQL> show user;
USER 為 "HR"
SQL> create table t(a varchar2(10),b varchar2(10));
表已建立。
不使用繫結變數:
我們向該表中插入五條資料:
SQL> set timing on;
SQL> declare
2 m varchar2(400);
3 begin
4 for i in 1 .. 5
5 loop
6 m := 'insert into t(a,b) values('||to_char(i)||','||to_char(i+1)||')';
7 execute immediate m;
8 end loop;
9 end;
10 /
PL/SQL 過程已成功完成。
已用時間: 00: 00: 00.13
使用繫結變數:
SQL> set timing on;
SQL> declare
2 m varchar2(400);
3 begin
4 for i in 1 .. 5
5 loop
6 m := 'insert into t(a,b) values(:1,:2)';
7 execute immediate m using i,i+1;
8 end loop;
9 end;
10 /
PL/SQL 過程已成功完成。
已用時間: 00: 00: 00.01
上面的pl/sql過程執行了兩次
透過時間也許我們還不能說明繫結變數的高效,下面我們透過v$sql檢視檢視執行的sql語句:
透過上面截圖,發現了沒有,繫結變數被呼叫了10次,只解析一次。
如果一項工程,沒有用繫結變數,無疑這是災難性的,oracle提供了強制把所有的sql轉換成繫結變數,把引數cursor_sharing改為force即可,但是這很容易造成bug:
SQL> show parameter cursor;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing string EXACT
cursor_space_for_time boolean FALSE
open_cursors integer 300
session_cached_cursors integer 50
SQL> show parameter cursor_sharing;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing string EXACT
Cursor_sharing引數有3個值可以設定:
EXACT:通常來說,exact值是Oracle推薦的,也是預設的,它要求SQL語句在完全相同時才會重用,否則會被重新執行硬解析操作
SIMILAR:similar是在Oracle認為某條SQL語句的謂詞條件可能會影響到它的執行計劃時,才會被重新分析,否則將重用SQL
FORCE:force是在任何情況下,無條件重用SQL
注意:上面所說的SQL重用,僅僅是指謂詞條件不同的SQL語句,實際上這樣的SQL基本上都在執行同樣的業務操作
這方面涉及到了oracle中的cursor物件,該物件在oracle十分重要。使用者程式的任務執行以及Cursor的使用是PGA記憶體的主要消耗者,
是我們進行資料庫效能最佳化最關心的內容,事實上資料庫的活動主要就是Cursor的活動。
下面透過列子說明使用和不使用繫結變數給系統帶來的效能問題:
SQL> select * from v$version where rownum<2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
SQL> show user;
USER 為 "HR"
SQL> create table t(a varchar2(10),b varchar2(10));
表已建立。
不使用繫結變數:
我們向該表中插入五條資料:
SQL> set timing on;
SQL> declare
2 m varchar2(400);
3 begin
4 for i in 1 .. 5
5 loop
6 m := 'insert into t(a,b) values('||to_char(i)||','||to_char(i+1)||')';
7 execute immediate m;
8 end loop;
9 end;
10 /
PL/SQL 過程已成功完成。
已用時間: 00: 00: 00.13
使用繫結變數:
SQL> set timing on;
SQL> declare
2 m varchar2(400);
3 begin
4 for i in 1 .. 5
5 loop
6 m := 'insert into t(a,b) values(:1,:2)';
7 execute immediate m using i,i+1;
8 end loop;
9 end;
10 /
PL/SQL 過程已成功完成。
已用時間: 00: 00: 00.01
上面的pl/sql過程執行了兩次
透過時間也許我們還不能說明繫結變數的高效,下面我們透過v$sql檢視檢視執行的sql語句:
透過上面截圖,發現了沒有,繫結變數被呼叫了10次,只解析一次。
如果一項工程,沒有用繫結變數,無疑這是災難性的,oracle提供了強制把所有的sql轉換成繫結變數,把引數cursor_sharing改為force即可,但是這很容易造成bug:
SQL> show parameter cursor;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing string EXACT
cursor_space_for_time boolean FALSE
open_cursors integer 300
session_cached_cursors integer 50
SQL> show parameter cursor_sharing;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing string EXACT
Cursor_sharing引數有3個值可以設定:
EXACT:通常來說,exact值是Oracle推薦的,也是預設的,它要求SQL語句在完全相同時才會重用,否則會被重新執行硬解析操作
SIMILAR:similar是在Oracle認為某條SQL語句的謂詞條件可能會影響到它的執行計劃時,才會被重新分析,否則將重用SQL
FORCE:force是在任何情況下,無條件重用SQL
注意:上面所說的SQL重用,僅僅是指謂詞條件不同的SQL語句,實際上這樣的SQL基本上都在執行同樣的業務操作
這方面涉及到了oracle中的cursor物件,該物件在oracle十分重要。使用者程式的任務執行以及Cursor的使用是PGA記憶體的主要消耗者,
是我們進行資料庫效能最佳化最關心的內容,事實上資料庫的活動主要就是Cursor的活動。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1587040/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在繫結變數下使用outline變數
- MySQL高階特性——繫結變數MySql變數
- [20180930]in list與繫結變數.txt變數
- [20180912]PLSLQ與繫結變數.txt變數
- Vue select 繫結動態變數Vue變數
- [20180930]in list與繫結變數個數.txt變數
- [20210120]in list與繫結變數個數.txt變數
- 【ORACLE】Oracle繫結變數知識梳理Oracle變數
- 繫結變數窺視測試案例變數
- [20200326]繫結變數抓取與NULL值.txt變數Null
- 如何用FGA得到繫結變數的值變數
- 如何在對in操作使用變數繫結(轉)變數
- [20220414]toad與繫結變數peek.txt變數
- [20231210]執行計劃與繫結變數.txt變數
- [20190506]檢視巢狀與繫結變數.txt巢狀變數
- [20191213]共享池繫結變數的值在哪裡.txt變數
- [20221103]繫結變數的分配長度11.txt變數
- [20221030]繫結變數的分配長度10.txt變數
- 透過v$sql_bind_capture 檢視繫結變數。SQLAPT變數
- V$sql查詢未使用繫結變數的語句SQL變數
- [20191216]共享池繫結變數的值在哪裡2.txt變數
- [20211227]抽取跟蹤檔案中的繫結變數值.txt變數
- [20210112]完善查詢繫結變數指令碼bind_cap.txt變數指令碼
- Oracle中如何查詢未使用繫結變數的SQL語句?Oracle變數SQL
- Oracle資料傾斜導致的問題-無繫結變數Oracle變數
- Oracle資料傾斜導致的問題-有繫結變數Oracle變數
- 越來越發現自己不懂的還是不少--繫結變數變數
- zepto繫結事件改變冒泡事件流事件
- Grails中如何繫結引數AI
- oracle 11g 新特性之動態繫結變數窺視(一)Oracle變數
- oracle 11g 新特性之動態繫結變數窺視(二)Oracle變數
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- 【工作篇】再次熟悉 SpringMVC 引數繫結SpringMVC
- cursor_sharing=force強制繫結變數不會把變數值預設當成varchar2型別的理解變數型別
- Oracle面對“資料傾斜列使用繫結變數”場景的解決方案Oracle變數
- 總結Sass 變數變數
- SpringMVC原始碼之引數解析繫結原理SpringMVC原始碼
- SpringMVC的引數繫結-日期格式轉換SpringMVC
- .net core Web API引數繫結規則WebAPI