天天看點

Oracle-shared pool

共享池shared pool的概念

使用者送出的指令:解析、執行

使用者指令的解析

解析的過程是一個相當複雜的過程,它要考慮各種可能的異常情況比如SQL語句涉及到的對象不存在、送出的使用者沒有權限等等而且還需要考慮如何執行SQL語句采用什麼方式去獲職資料等解析的最終結果是要産生oracle自己内部的執行計劃進而指導SQL的執行過程。可以看到,解析的過程是一個非常消耗資源的過程。是以oracle在解析使用者送出的SQL語句的過程中如果對每次出現的新的SQL語句,都按照标準過程完整的從頭到尾解析一遍的話效率太低尤其随着并發使用者數量的增加、資料量的增加資料庫的整體性能将直線下降。

shared pool=Library cache+dictionay cache

Library cache是重點;所有資訊都放在dictionary cache

資料擷取方式:全表/索引;表是如何連接配接;

代碼共享----執行計劃共享

SQL語句靜态部分和動态部分:

oracle對SQL語句進行了概括和抽象将SQL語句提煉為兩部分一部分是SQL語句的靜态部分也就是SQL語句本身的關鍵詞、所涉及的表名稱以及表的列等另一部分就是SQL語句的動态部分.也就是SQL語句中的值(即表裡的資料)很明顯的,整個資料庫中所包含的對象數量是有限的,而其中所包含的資料則是無限的,而正是這無限的資料導緻了SQL語句的千變萬化,也就是說在資料庫運作的過程中發生的所有SQL語句中靜态部分可以認為是有限的.而動态部分則是無限的。而實際上.動态部分對解析的影響相比靜态部分對解析的影響來說是微乎其微.也就是說通常情況下對于相同的靜态部分的SQL語句來說不同的動态部分所産生的解析結果(執行計劃)基本都是一樣的這也就為oracle提高解析SQL語句的效率提供了方向

Select····From····靜态Where····動态

——————通過參數解決動态沒有綁定變量的問題

共享池

oracle會将使用者送出來的SQL語句都緩存在記憶體中。每次處理新的一條SQL語句時都會先在記憶體中檢視是否有相同的SQL語句如果相同則可以減少最重要的解析工作〔也就是生成執行計劃)進而節省了大量的資源:反之如果沒有找到相同的SQL語句,則必須重新從頭到尾進行完整的解析過程這部分存放SQL語句的記憶體就叫做共享池( shared pool)當然shared pool裡不僅僅是SQL語句,還包括管理shared pool的記憶體結構以及執行計劃、控制資訊等等記憶體結構,oracle通過記憶體結構管理

綁定變量

當orocle在shared pool中查找相同的SQL語句的過程中如果SQL語句使用了綁定變量( bind variable ) ,那麼就是比較SQL語句的靜态部分。前面我們已經知道.靜态部分是有限的,很容易就能夠緩存在記憶體裡進而找到相同的SQL語句的機率很高如果沒有使用綁定變量.則就是比較SQL語句的靜态部分和動态部分,而動态部分的變化是無限的.是以這樣的SQL語句很難被緩存在shared pool裡畢竟記憶體是有限的.不可能把所有的動态部分都緩存在shared pool裡,即使能夠緩存,管理這樣一個無限大的shared pool也是不可能完成的任務。不使用綁定變量導緻的直接結果就是,找到相同的SQL語句的機率很低.導緻必須完整的解析SQL語句,也就導緻消耗更多的資源。從這裡也可以看出,隻有我們使用了綁定變量才真正遵循了oracle引入shared pool的哲學思想,才能更有效的利用shared pool