數(shù)據(jù)庫優(yōu)化技術之Oracle數(shù)據(jù)庫動態(tài)綁定變量
我們知道,分享池(shared pool)是系統(tǒng)大局區(qū)(System Global Area ,SGA)中一個極其重要的分享內(nèi)存構造。然而Oracle數(shù)據(jù)庫將已解析、已編譯的SQL 連同其他內(nèi)容存儲在這里??墒且呀馕?,已編譯的SQL要想告終其復用有一個前提,要求開發(fā)人員在大多數(shù)情形下都會利用綁定變量。本文我們主要就介紹了一些Oracle數(shù)據(jù)庫綁定變量的知識,下面我們就開始介紹。
綁定變量(bind variable)是查詢中的一個占位符。
例如比擬如下SQL語句:
- select * from table where id = 1與
- my_id := 1
- select * from table where id = my_id
對于***個SQL語句,在查詢中利用直接量(常量),那么每個查詢都將是一個嶄新的查詢,在數(shù)據(jù)庫看來過去從未見過,定然對查詢舉行解析、限量(命名解析)、平安性察看、優(yōu)化等。容易地講,即便你厲行的每條不同的語句都要在厲行時舉行編譯。(解析包括有硬編碼變量的語句稱為硬解析)
而對于第二個查詢利用了一個綁定變量my_id,變量值在查詢厲行時供給。這個查詢只編譯順次,隨后會把查詢計劃存儲在一個分享池(庫緩存)中,以便爾后獲得和重用這個查詢計劃,(重用已解析的查詢計劃稱為軟解析)。
軟解析與硬解析之間的差異重要體目前以下幾個方面:
1、與軟解析相比硬解析必需的工夫更長,而且要花費更多的資源,硬解析會收縮系統(tǒng)能扶持的用戶數(shù)。
2、硬解析一個查詢時,數(shù)據(jù)庫會更伙計夫地挪借一種低級串行穿戴備,這稱為閂(latch),這些閂能防御Oracle分享內(nèi)存中的數(shù)據(jù)構造不會同時被兩個歷程修正,而且萬一有人正在修正數(shù)據(jù)構造,則不批準另外的人再來讀取。對這些數(shù)據(jù)構造加閂的工夫越長、越頻繁,排隊期待閂的歷程就越多,期待隊列也越長。你可能開始壟斷貴重的資源。有時你的計算機顯明利用不足,然而數(shù)據(jù)庫中的所有利用都運行得極其慢。構成這種假象的起因可能是有人割據(jù)著某種串行穿戴備,而其他期待串行穿戴備的人開始排隊,因而你無法全速運行。數(shù)據(jù)庫中凡是有一個利用出現(xiàn)不佳,就會嚴重地波及所有其他利用的功能。萬一只有一個薄利用沒利于用綁定變量,那么即便其他利用原本設計得很好,能妥本地將已解析的SQL放在分享池中以備重用,但因為這個薄利用的存在,過一段工夫就會從分享池中剔除已存儲的SQL。這就使得這些設計貼切的利用也定然再次硬解析SQL。
代碼告終實例:
1、oracle自己默認告終的綁定變量:
- for i in 1..1000 loop
- select count(*) into my_count from table where my_type = i;
- ne.nexuscenter.com.cn<end loop;
在上面的情形,Oracle會自己綁定變量,即,萬一參數(shù)保留在一個數(shù)組中,select語句放在一個循環(huán)中,select 語句只會編譯順次。
2、動態(tài)綁定變量
- my_type:='type1';
- my_count := 0;
- my_sql:='select count(*) into :x from table where type = :y'
- Execute Immediate my_sql into my_count using my_type;
然而這段代碼包括額外的String,并非全面必需。
關于Oracle數(shù)據(jù)庫優(yōu)化的知識就介紹到這里了,如果您想了解更多的關于Oracle數(shù)據(jù)庫的知識,可以看一下這里的文章:http://database.51cto.com/oracle/,相信一定能夠帶給您收獲的!
【編輯推薦】






