對(duì)Oracle SQL相同語(yǔ)句的解析
在實(shí)際的應(yīng)用中我們?yōu)榱瞬恢貜?fù)的去解析相同的Oracle SQL語(yǔ)句,一般都會(huì)在***次解析完之后, 就把Oracle SQL語(yǔ)句存放在相關(guān)的內(nèi)存中。這塊位于系統(tǒng)全局區(qū)域SGA(system global area)的共享池(shared buffer pool)中的內(nèi)存可以被所有的數(shù)據(jù)庫(kù)用戶共享。
因此,當(dāng)你執(zhí)行一個(gè)SQL語(yǔ)句(有時(shí)被稱為一個(gè)游標(biāo))時(shí),如果它和之前的執(zhí)行過的語(yǔ)句完全相同, Oracle就能很快獲得已經(jīng)被解析的語(yǔ)句以及***的執(zhí)行路徑。 Oracle的這個(gè)功能大大地提高了Oracle SQL的執(zhí)行性能并節(jié)省了內(nèi)存的使用。
可惜的是Oracle只對(duì)簡(jiǎn)單的表提供高速緩沖(cache buffering) ,這個(gè)功能并不適用于多表連接查詢。數(shù)據(jù)庫(kù)管理員必須在init.ora中為這個(gè)區(qū)域設(shè)置合適的參數(shù),當(dāng)這個(gè)內(nèi)存區(qū)域越大,就可以保留更多的語(yǔ)句,當(dāng)然被共享的可能性也就越大了。當(dāng)你向Oracle 提交一個(gè)SQL語(yǔ)句,Oracle會(huì)首先在這塊內(nèi)存中查找相同的語(yǔ)句。
這里需要注明的是,Oracle對(duì)兩者采取的是一種嚴(yán)格匹配,要達(dá)成共享,Oracle SQL語(yǔ)句必須完全相同(包括空格,換行等)。
共享的語(yǔ)句必須滿足三個(gè)條件:
A. 字符級(jí)的比較:
當(dāng)前被執(zhí)行的語(yǔ)句和共享池中的語(yǔ)句必須完全相同。
例如:
- SELECT * FROM EMP;
和下列每一個(gè)都不同
- SELECT * from EMP;
- Select * From Emp;
- SELECT * FROM EMP;
B. 兩個(gè)語(yǔ)句所指的對(duì)象必須完全相同:
例如:
用戶 對(duì)象名 如何訪問
- Jack sal_limit private synonym
- Work_city public synonym
- Plant_detail public synonym
- Jill sal_limit private synonym
- Work_city public synonym
- Plant_detail table owner
考慮一下下列SQL語(yǔ)句能否在這兩個(gè)用戶之間共享。
C. 兩個(gè)Oracle SQL語(yǔ)句中必須使用相同的名字的綁定變量(bind variables)
例如:***組的兩個(gè)Oracle SQL語(yǔ)句是相同的(可以共享),而第二組中的兩個(gè)語(yǔ)句是不同的(即使在運(yùn)行時(shí),賦于不同的綁定變量相同的值)
a.
- select pin , name from people where pin = :blk1.pin;
- select pin , name from people where pin = :blk1.pin;
b.
- select pin , name from people where pin = :blk1.ot_ind;
- select pin , name from people where pin = :blk1.ov_ind;
以上的相關(guān)內(nèi)容就是對(duì)共享Oracle SQL語(yǔ)句的介紹,望你能有所收獲。
文章出自:http://www.programbbs.com/doc/class10-2.htm
【編輯推薦】