Library Cache

Library Cache中包括共用Shared SQL Areas、PL/SQL(Procedures and Package)以及控制元件(Control Structure)如Lock、記憶體控制碼等等。
  • Shared SQL Area :當一句SQL語法進來時,Oracle就會為每一句SQL打開一個Cusor並提供一個Shared SQL Area和Private SQL Area空間存放,當發現兩個以上的連線在使用同一句SQL語法時,Oracle會重新組織Shared SQL Area,使這些使用者連線能重複使用用此區域的內容而不會浪費寶貴的資源,同時還會在Private SQL Area中保存一份這句SQL語法的副本,反之,如果沒有找到相同的SQL語法時,則必須重新進行完整的解析作業,並將解析過程(Parse Tree)以及執行計畫等存放共用區內,以備下次使用。這時要注意的是當Oracle在共用區找尋相同的SQL語法的過程中,如果使用的SQL語法有任何一個地方不相同,Oracle就會視此SQL語法在此共用區找不到,所以就需要重新做解析的動作。因此若當同一段SQL語法只是在條件的部份輸入不同的值,Oracle也會視為SQL語法不同,為了因應此重大的因素可使用綁定變數(Bind Variable),所謂的綁定變數(Bind Variable),就是Oracle會將變動的值視為Bind Variable,如此很容易讓儲存在共用區裡找到相同的SQL語法。
TIP
當一條新的SQL語法被解析(Parse)時,Oracle從共用區中分配一塊記憶體來存儲Shared SQL Area,而這塊被分配的記憶體的大小與這條語句的複雜性相關,如果Shared Pool中不夠空間分配給Shared SQL Area使用,Oracle就會啟動LRU機制將最近最少使用的記憶體區塊釋放出來,直到有足夠空間給新SQL語法的Shared SQL Area,被釋放出來的那快記憶體區塊內的SQL語法如果再次被使用時就必須重新解析(Parse),並重新分配Shared SQL Area,而這些動作都是比較消耗CPU的作業。這就是為什麼要使用綁定變數(Bind Variable)的原因了,因為如果沒有使用綁定變數(Bind Variable)時,當SQL語法中的變數的數值不同時,Oracle就視為一條新的語句,重複上面的解析、記憶體分配的等等動作,這都將大大消耗系統資源,降低Oracle系統效能。
  • PL/SQL Procedures and Package:Oracle對於PL/SQL Procedures 、Functions、Triggers、 Packages等等的處理過程和上述的SQL語法處理過程與方式相同,會分配一個記憶體來存儲被解析、編譯過的Procedures 、Functions、 Triggers、 Packages等等。同時分配一個Private SQL Area空間來存放運作中的程數值、變數、所需記憶體等相關資訊等等。如果是多個連線同時使用同一個PL/SQL程式,除了會共用一個程式之外,在各自的Private SQL Area還會保留一份主要是用於儲存Session的變數值。
TIP
當PL/SQL 程式裡的SQL語法是會當成普通的SQL語法處理,也就是說Oracle會為這些PL/SQL 程式裡的SQL語法提供一個Shared SQL Area和Private SQL Area空間存放。

沒有留言:

張貼留言