oracle 綁定變量

「綁定變量」這個詞也許對於某些人來講看以來陌生,其實咱們在很早的時候就已經開始運用它了。java

在java中使用的PrepareStatement對象,你們必定會說這不是將sql語句作預編譯操做嘛,被封裝的sql語句能夠包含動參數,減小編譯的次數,提升數據庫性能,減輕jvm的負荷。sql

其實「綁定變量」的用途就是如上邊所說。數據庫

那麼咱們用到它的前提是,大量批量操做,條件相同,但參數值不一樣。oracle

網上有這樣的例子jvm

CREATE TABLE TTT1 (X INT);

CREATE OR REPLACE PROCEDURE PROC1
AS
BEGIN
        FOR i IN 1 .. 100000
        LOOP
                EXECUTE IMMEDIATE 'INSERT INTO TTT1 VALUES(:X)' USING i;
        END LOOP;
END;
/


CREATE OR REPLACE PROCEDURE PROC2
AS
BEGIN
        FOR i IN 1 .. 100000
        LOOP
                EXECUTE IMMEDIATE 'INSERT INTO TTT1 VALUES('||i||')';
        END LOOP;
END;
/

兩個存儲過程都很簡單,都是向表TTT1中插入1-100000條記錄,惟一的不一樣是proc1使用了綁定變量:x,proc2沒有使用綁定變量,咱們來簡單的看一下執行時間:
ETL@DWTEST> EXEC PROC1;

PL/SQL procedure successfully completed.

Elapsed: 00:00:02.80
ETL@DWTEST> EXEC PROC2;

PL/SQL procedure successfully completed.

Elapsed: 00:00:06.27

能夠看到PROC2的執行時間幾乎是PROC1執行時間的3倍!
TOM曾說過:Oracle 將已解析、已編譯的SQL 連同其餘內容存儲在共享池(shared pool)中,這是系統全局區(System Global Area ,SGA)中一個很是重要的共享內存結構。若是你確實想讓Oracle 緩慢地運行,甚至幾近停頓,只要根本不使用綁定變量就能夠辦到。
若是使用綁定變量,不管是誰,只要提交引用同一對象的同一個查詢,都會使用共享池中已編譯的查詢計劃。這樣你的子例程只編譯一次就能夠反覆使用。這樣作效率很高,這也正是數據庫指望你採用的作法。你使用的資源會更少(軟解析耗費的資源至關少),不只如此,佔用閂的時間也更短,並且再也不那麼頻繁地須要閂。這些都會改善應用的性能和可擴縮性。
實際上,proc2 須要的時間幾乎是proc1 的3 倍,這說明,在這種狀況下,對於每一個「無綁定變量」的INSERT,執行語句所需時間中有2/3 僅用於解析語句!所以,請檢查一下咱們曾經寫過的程序,看一看是否可使用綁定變量,若是真的可使用綁定變量,那我確信程序通過修改能夠提升一大截性能!

  

JAVA中綁定變量的測試代碼
2012-04-12 11:54 達內培訓

寫這篇文章的目的並不想爲你講述什麼樣的知識,只是但願爲你提供幫助。你們能夠將代碼測試一下,理解其實現原理,對你們學習確定能有所幫助
一段在JAVA中綁定變量的測試代碼,達內培訓爲你整理。
import java.sql.*;
import oracle.jdbc.driver.*;
class ConOra {
public static void main(String args[] ) throws SQLException{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.152:1521:whx","system","lukewhx");
PreparedStatement stmt ;
ResultSet rset ;
String v_sql;
/*
for (int i =1;i<=1000;i++){
v_sql="select object_name from objects where object_id="+i;
stmt =conn.prepareStatement(v_sql);
rset=stmt.executeQuery();
stmt.close();
} 
*/
for (int i =1 ;i<=1000;i++ ) {
v_sql = "select object_name from objects where object_id= :x ";
stmt=conn.prepareStatement(v_sql);
stmt.setString(1,Integer.toString(i));
rset = stmt.executeQuery();
stmt.close();
} 
System.out.println("Execute OK");
}
}
相關文章
相關標籤/搜索