sql like 绑定变量_码硬解析的改进方法之二使用绑定变量
綁定變量要求變量名稱,數據類型以及長度是一致,否則無法使用軟解析
綁定變量(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優化相對比較困難
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的sql like 绑定变量_码硬解析的改进方法之二使用绑定变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python计时器代码_用Python写
- 下一篇: python假设检验平均_Python|