資料庫開發之繫結變數

2021-06-06 14:58:17 字數 2286 閱讀 3016

對於每個程式開發人員來說,資料庫的知識都是或多或少的了解些,都能編寫一些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段的管理等等。資料庫並不是一門簡單的「語言」,資料庫調優與維護更是資料庫的精華所在,需要我們學而時習之!

資料庫優化 ORACLE動態繫結變數

oracle 將已解析 已編譯的sql 連同其他內容儲存在共享池 shared pool 中,這是系統全域性區 system global area sga 中乙個非常重要的共享記憶體結構。但是已解析,已編譯的sql要想實現其復用有乙個前提,要求開發人員在大多數情況下都會使用繫結變數。繫結變數 bi...

Gridview用法之資料庫繫結

protected void button1 click object sender,eventargs e if textbox1.text textbox2.text if textbox1.text textbox2.text if textbox1.text textbox2.text 重構...

中安威士資料庫審計之繫結變數審計

近年來,隨著相關法律法規的完善 國家等級化保護要求,以及行業風險管理和內控指標的出台,安全審計產品慢慢的為大家所熟悉。而近年來資料盜竊和資料洩露等高危事件頻發,資料安全也越來越受各大企業和單位的重視。資料庫審計就是一款保護使用者資料安全的產品。上一期的資料庫審計功能我們詳述了雙向審計,今天我們來聊一...