繫結變數及其優缺點

2021-08-27 23:01:57 字數 2976 閱讀 3743

變數繫結(bind variable)

是指在sql語句的條件中使用變數而不是

常量。比如shared pool裡有兩條

sql語句,

select * from tab1 where col1=1;

select * from tab1 where col1=2;

對oracle資料庫來說,這是兩條完全不同的sql,對這兩條語句都需要進行hard parse。因為oracle會根據

sql語句的文字去計算每個字元在記憶體裡的hash值,因此雖然上述兩條sql只有乙個字元不一樣,oracle根據hash演算法在記憶體中得到的hash位址就不一樣,所以oracle就會認為這是兩條完全不同的語句。而如果將上述sql改寫成select * from tab1 where col1=:var1;,然後通過對變數var1的賦值去查詢,那麼oracle對這條語句第一次會進行hard parse,以後就只進行soft parse。假設某條語句被重複執行了幾十萬次,那麼使用bind var帶來的好處是巨大的。乙個應用程式如果bind var使用不充分,那麼幾乎一定會伴隨著嚴重的效能問題。

繫結變數是相對文字變數來講的,所謂文字變數是指在sql直接書寫查詢條件,這樣的sql在不同條件下需要反覆解析,繫結變數是指使用變數來代替直接書寫條件,查詢bind value在執行時傳遞,然後繫結執行。優點是減少硬解析,降低cpu的爭用,節省shared_pool ;缺點是不能使用histogram,

sql優化比較困難

對於每個程式開發人員來說,資料庫的知識都是或多或少的了解些,都能編寫一些sql語句,即使不會也可以使用一些工具來生成sql語句,因此資料庫在很多時候被認為是沒有必要研究的。隨著系統使用人數增加,系統也遇到了瓶頸,於是開發人員高呼:「給我記憶體與cpu,系統將會faster!」可是作為盈利性企業,投入與回報是不能成等價比的,必須做到投入少回報多!所以,資料庫的開發在系統的前期工作當中非常重要,良好的資料庫設計將會提公升系統的可擴充套件性。

資料庫在執行sql語句時會首先解析sql語句,解析又分為硬解析與軟解析。說到硬解析和軟解析,就不能不說一下oracle對sql的處理過程。當你發出一條sql語句交付oracle,在執行和獲取結果前,oracle對此sql將進行幾個步驟的處理過程:

1、語法檢查(syntax check)

檢查此sql的拼寫是否語法。

2、語義檢查(semantic check)

諸如檢查sql語句中的訪問物件是否存在及該使用者是否具備相應的許可權。

3、對sql語句進行解析(prase)

利用內部演算法對sql進行解析,生成解析樹及執行計畫。

4、執行sql,返回結果(execute and return)。

其中,軟、硬解析就發生在第三個過程裡,oracle利用內部的hash演算法來取得該sql的hash值,然後在librarycache裡查詢是否存在該hash值。假設存在,則將此sql與cache中的進行比較(注意此處的比較哪怕是乙個字母的大小寫、空格個數不一致都會認為不同)。假設「相同」,就將利用已有的解析樹與執行計畫,而省略了優化器的相關工作。這也就是軟解析的過程;如果上面的2個假設中任有乙個不成立,那麼優化器都將進行建立解析樹、生成執行計畫的動作。這個過程就叫硬解析。由此可以看出應該極力避免硬解析,盡量使用軟解析。

有什麼方法能盡量使用軟解析呢?答曰:「繫結變數,效果好」。如果使用繫結變數,只要提交引用同一物件的同乙個查詢,都會使用共享池中已編譯的查詢計畫。這樣你只需編譯一次就能反覆使用,效率當然會高。這也是資料庫希望你採用的方法。

下面來看乙個簡單的例子,首先建立乙個簡單表

sql> create table t (x int);

然後建立乙個使用繫結變數往t表插入資料的儲存過程:

sql> create or replace procedure pro1

2 as

3  begin

4 for i in 1..10000

5     loop

6      execute immediate

7     'insert into t values(:x)' using i;

8   end loop;

9 end;

再建立乙個不適用繫結變數往t表查資料的儲存過程:

sql> create or replace procedure pro2

2 as

3 begin

4 for i in 1..10000

5     loop

6      execute immediate

7     'insert into t values('||i||')';

8   end loop;

9 end;

sql> set timing on

sql> exec pro1;

pl/sql 過程已成功完成。

sql> truncate table t; --此目的只是與執行儲存過程pro1前t表都為空

表被截斷。

sql> exec pro2;

pl/sql 過程已成功完成。

sql> set timing off

結果非常明顯,使用繫結變數節省的時間可不是一點。這只是個簡單的例子,如果在實際應用中那節省的時間將會更多,可能就會造成2個不同效能級別的應用系統。在乙個已成型的應用系統中再重新使用繫結變數時費時費力的,你要尋找每個sql語句,檢視是否能使用繫結變數,最重要的是你可能已經提交給客戶,這直接影響到客戶的滿意度。

繫結變數的好處是減少了硬解析,降低了cpu的競爭,節省了shared_pool,但缺點是不能使用柱狀圖(histogram),sql優化比較困難。

在系統的研發階段,應該為資料庫設計投入更多的時間,因為所有的資料都是在後台執行的,後台的效能在很大程度上決定了乙個系統的效能。

不要以為資料庫只有select、insert、update、delete,這些只是資料庫的基礎操作,只是這些簡單的操作就需要開發人員增加一些hint來加快資料的操作,由這些操作還能延伸到資料庫的redo日誌、undo段的管理等等。資料庫並不是一門簡單的「語言」,資料庫調優與維護更是資料庫的精華所在,需要我們學而時習之!

jquery的繫結事件及其優缺點

jquery中提供了四種事件監聽方式,分別是bind live delegate on,對應的解除監聽的函式分別是unbind die undelegate off。可以向匹配的元素繫結乙個或者多個事件處理器。但是它不會在沒有存在dom樹中的元素繫結該事件 而live delegate 則可以實現在...

什麼是繫結變數,有什麼優缺點?

提到繫結變數,首先肯定想到硬解析和軟解析。繫結變數時解決硬解析的利器。硬解析 就是一條沒有執行過的sql。資料庫首先對他進行語法分析和解析,過後,根據分析的資訊生成最好的執行計畫,然後執行。軟解析 就是已經存在了一樣的sql語句了 繫結變數實質就是變數。類似於我們是用過的替代變數 佔位符 就是在sq...

Spring以及其優缺點。

什麼是spring spring 是乙個開源框架,是為了解決企業應用程式開發複雜性而建立的。在這篇由三部分組成的spring系列的第1 部分中,我將介紹spring框架。我先從框架底層模型的角度描述該框架的功能,然後將討論兩個最有趣的模組 spring面向方面程式設計 aop 和控制反轉 ioc s...