「綁定變量」這個詞也許對於某些人來講看以來陌生,其實咱們在很早的時候就已經開始運用它了。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"); } }