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