繫結變數

Diy_os發表於2015-04-20
在開發中,如果不使用繫結變數,會給系統帶來災難性的後果,因為我們寫的每一條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的活動。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1587040/,如需轉載,請註明出處,否則將追究法律責任。

相關文章