Oracle硬解析與軟解析:碼硬解析的改進方法之二使用綁定變量

綁定變量要求變量名稱,數據類型以及長度是一致,不然沒法使用軟解析
綁定變量(bind variable)是指在DML語句中使用一個佔位符,即便用冒號後面緊跟變量名的形式,以下
select * from emp where empno=7788 --未使用綁定變量
select * from emp where empono=:eno --:eno即爲綁定變量
在第二個查詢中,變量值在查詢執行時被提供。該查詢只編譯一次,隨後會把查詢計劃存儲在一個共享池(庫緩存)中,以便之後獲取
和重用這個查詢計劃。
下面使用了綁定變量,但兩個變量其實質是不相同的,對這種情形,一樣使用硬解析
select * from emp where empno=:eno;
select * from emp where empno=:emp_no
使用綁定變量時要求不一樣的會話中使用了相同的回話環境,以及優化器的規則等。
使用綁定變量的例子(參照了TOM大師的Oracle 9i&10g編程藝術)
scott@ASMDB> create table tb_test(col int); --建立表tb_test
scott@ASMDB> create or replace procedure proc1 --建立存儲過程proc1使用綁定變量來插入新記錄
2 as
3 begin
4 for i in 1..10000
5 loop
6 execute immediate 'insert into tb_test values(:n)' using i;
7 end loop;
8 end;
9 /
Procedure created.
scott@ASMDB> create or replace procedure proc2 --建立存儲過程proc2,未使用綁定變量,所以每個SQL插入語句都會硬解析
2 as
3 begin
4 for i in 1..10000
5 loop
6 execute immediate 'insert into tb_test values('||i||')';
7 end loop;
8 end;
9 /
Procedure created.
scott@ASMDB> exec runstats_pkg.rs_start
PL/SQL procedure successfully completed.
scott@ASMDB> exec proc1;
PL/SQL procedure successfully completed.
scott@ASMDB> exec runstats_pkg.rs_middle;
PL/SQL procedure successfully completed.
scott@ASMDB> exec proc2;
PL/SQL procedure successfully completed.
scott@ASMDB> exec runstats_pkg.rs_stop(1000);
Run1 ran in 1769 hsecs
Run2 ran in 12243 hsecs --run2運行的時間是run1的/1769≈倍
run 1 ran in 14.45% of the time
Name Run1 Run2 Diff
LATCH.SQL memory manager worka 410 2,694 2,284
LATCH.session allocation 532 8,912 8,380
LATCH.simulator lru latch 33 9,371 9,338
LATCH.simulator hash latch 51 9,398 9,347
STAT...enqueue requests 31 10,030 9,999
STAT...enqueue releases 29 10,030 10,001
STAT...parse count (hard) 4 10,011 10,007 --硬解析的次數,前者只有四次
STAT...calls to get snapshot s 55 10,087 10,032
STAT...parse count (total) 33 10,067 10,034
STAT...consistent gets 247 10,353 10,106
STAT...consistent gets from ca 247 10,353 10,106
STAT...recursive calls 10,474 20,885 10,411
STAT...db block gets from cach 10,408 30,371 19,963
STAT...db block gets 10,408 30,371 19,963
LATCH.enqueues 322 21,820 21,498 --閂的隊列數比較
LATCH.enqueue hash chains 351 21,904 21,553
STAT...session logical reads 10,655 40,724 30,069
LATCH.library cache pin 40,348 72,410 32,062 --庫緩存pin
LATCH.kks stats 8 40,061 40,053
LATCH.library cache lock 318 61,294 60,976
LATCH.cache buffers chains 51,851 118,340 66,489
LATCH.row cache objects 351 123,512 123,161
LATCH.library cache 40,710 234,653 193,943
LATCH.shared pool 20,357 243,376 223,019
Run1 latches total versus runs -- difference and pct
Run1 Run2 Diff Pct
157,159 974,086 816,927 16.13% --proc2使用閂的數量也遠遠多於proc1,其比值是.13%
PL/SQL procedure successfully completed.
由上面的示例可知,在未使用綁定變量的情形下,不管是解析次數,閂使用的數量,隊列,分配的內存,庫緩存,行緩存遠遠高於綁定
變量的狀況。所以儘量的使用綁定變量避免硬解析產生所需的額外的系統資源。
綁定變量的優勢
減小SQL語句的硬解析,從而減小因硬解析產生的額外開銷(CPU,Shared pool,latch)。其次提升編程效率,減小數據庫的訪問次數。
綁定變量的缺點
優化器就會忽略直方圖的信息,在生成執行計劃的時候可能不夠優化。SQL優化相對比較困難
相關文章
相關標籤/搜索