繫結變數
在開發中,如果不使用繫結變數,會給系統帶來災難性的後果,因為我們寫的每一條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語句:
![](http://img.blog.itpub.net/blog/attachment/201504/20/29876893_1429509870qTh1.png?x-oss-process=style/bb)
透過上面截圖,發現了沒有,繫結變數被呼叫了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語句:
![](http://img.blog.itpub.net/blog/attachment/201504/20/29876893_1429509870qTh1.png?x-oss-process=style/bb)
透過上面截圖,發現了沒有,繫結變數被呼叫了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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 繫結變數之繫結變數窺探(Bind Peeking)變數
- Oracle 繫結變數Oracle變數
- 檢視繫結變數變數
- 繫結變數窺測變數
- PLSQL使用繫結變數SQL變數
- Oracle之繫結變數Oracle變數
- 關於繫結變數變數
- 【優化】使用繫結變數 OR 不使用繫結變數,這不是問題!優化變數
- ORACLE 繫結變數用法總結Oracle變數
- 【最佳化】使用繫結變數 OR 不使用繫結變數,這不是問題!變數
- 繫結變數窺測的演變變數
- Oracle 變數繫結與變數窺視合集Oracle變數
- 繫結變數的測試變數
- Oracle 繫結變數窺探Oracle變數
- oracle 繫結變數(bind variable)Oracle變數
- 如何獲取繫結變數變數
- Oracle 繫結變數 詳解Oracle變數
- 關於繫結變數的SQL繫結什麼值變數SQL
- MySQL高階特性——繫結變數MySql變數
- SQL Developer中使用繫結變數SQLDeveloper變數
- 繫結變數之基本概念變數
- ORACLE 獲取繫結變數值Oracle變數
- 繫結變數及其優缺點變數
- 繫結變數的一個例子變數
- 繫結變數和BIND PEEKING變數
- 如何獲取繫結變數值變數
- 繫結變數的使用範圍變數
- oracle繫結變數的測試Oracle變數
- 查詢繫結變數的值變數
- 關於繫結變數的使用變數
- oracle繫結變數窺視(zt)Oracle變數
- 使用繫結變數的一點總結!變數
- 繫結變數優缺點、使用、繫結變數窺探、 Oracle自適應共享遊標變數Oracle
- 【原創】Oracle 變數繫結與變數窺視合集Oracle變數
- 從不繫結變數與繫結變數兩種情況討論柱狀圖的作用變數
- Vue select 繫結動態變數Vue變數
- 繫結變數窺視測試案例變數
- 【ORACLE】Oracle繫結變數知識梳理Oracle變數