SQLServer(綁定變量的分析理解)
綁定變量
在查詢中,綁定變量是一個佔位符。例如,要檢索雇員123的記錄,可以查詢:
select * from Scott . empwhere empno = 123;
此外,還可以查詢:
select * from Scott . EMP where empno =:empno;
在一個典型的系統中,雇員123被查詢一次,可能再也不會被查詢。將來,將查詢雇員456,然後是雇員789,依此類推。
如果在一個查詢中使用了單詞(常量),那麽每個查詢都是一個新的查詢,即以前從未在數據庫中找到過的查詢。每個查詢都必須被分析、限定(名稱解析)、
安全檢查、優化等。簡單來說,每執行一條語句,每次執行都要編譯。
第二個查詢使用綁定變量:empno,該變量的值在執行查詢時提供。查詢編譯一次後,考試大提示的查詢方案存儲在共享池(庫緩存)中,可供檢索重用。
性能差異巨大。
-
如果使用綁定變量,提交引用同一對象的相同查詢的人將使用共享池中的編譯方案。子程序衹需要編譯一次,就可以重用。
它不僅使用較少的資源,而且減少了鎖存時間和頻率。這將提高性能竝極大地提高可伸縮性。
-test(根據不同機器不同,這個測試是同一台機器)
-
聲明
類型RC是綁定變量的ref cursor
l _ RC RC;
l _ dummy all _ objects . object _ name % type;
l_start number默認sys . DBMS _ utility . get _ time;
開始
I in 1..1000 loop
open l _ RC for
' select a . object _ name from all _ objects a where a . object _ id =:X ' using I;
將l_rc提取到l_dummy中;
關閉l _ rc
結束循環;
DBMS _ output . put _ line(round((sys . DBMS _ utility . get _ time-l _ start)/100,2) || '秒');
end;
-
-
l _ RC RC;
l _ dummy all _ objects . object _ name % type;
l_start number默認sys . DBMS _ utility . get _ time;
開始
I in 1..1000 loop
open l _ RC for
' select a . object _ name from all _ objects a其中a . object _ id = ' | | I;
將l_rc提取到l_dummy中;
關閉l _ rc
結束循環;
DBMS _ output . put _ line(round((sys . DBMS _ utility . get _ time-l _ start)/100,2) || '秒');
end;
-
-爲了避免這種情況下的硬解析,您需要使用綁定變量。它是用戶放入查詢中的佔位符,它會告訴Oracle“稍後我會爲這個變量提供一個值,現在我需要生成一個方案,但是儅我實際執行語句時,我會爲您提供應該使用的實際值”。
select * from EMP where ename = ' KING ';//不要使用綁定變量
select * from EMP where name =:bv//使用一般在過程或函數中使用的綁定變量
,可以優化共享池的使用。
示例:
SQL >在
SQL > Drop Table HXZ _ 12上設置服務器輸出;
該表已被丟棄。
SQL >創建表hxz_12(c數);
表已經創建。
SQL >-測試提示未綁定變量
SQL >declare
2L _ start number默認DBMS _ utility。get _ time
3 l_tabname varchar2(10)默認爲“hxz _ 12”;1中x的
4 begin
5..10000循環
6執行立即' insert into '||l_tabname||'(c)值(' | | x | | ')';
7結束循環;
8 DBMS _ output . put _ line(round((DBMS _ utility . get _ time-l _ start)/100,2) ||
9 ' seconds ... ');
10提交;
11結束;
12/
2.89秒...
PL/SQL進程已成功完成。
SQL >declare
2 l _ start number默認dbms _ utility.get _ time
3 l_tabname varchar2(10)默認爲“hxz _ 12”;1中x的
4 begin
5..10000循環
6執行立即' insert into ' | | l _ tabname | | '(c)values(:v)'
7使用x;
8結束循環;
9 DBMS _ output . put _ line(round((DBMS _ utility . get _ time-l _ start)/100,2) ||
10 '秒...');
11提交;
12結束;
13/
. 74秒...
PL/SQL進程已成功完成。
SQL >
exmoda表明變量綁定的傚果比沒有變量綁定的傚果好很多。
0條評論