close

Free 空間(參考上圖)

 只能設定shared pool大小,不能設定內部各個大小

 

 free空間中有鏈(chain)的概念,每條鏈的內存塊大小都是不一樣的,越下面的內存塊越大

 

 oracle為什麼要使用大量的鏈(chain)??

 

 1.把我們需要的內存塊組織()起來

 

 2.可以遍歷,鏈有頭有尾,所有的塊都掛在鏈上,可以在鏈上找到每個塊

 

 SQL語句解析過程

 

 1.現在解析了一個SQL語句,在Library cache裡沒有找到緩存的SQL語句

 

 2.根據解析的SQL語句與其執行計畫,和它所需要占用的實際空間,從free空間的鏈上找塊

 

 3.假如我們需要10K的空間,就到free8K~12K鏈上去找,找到111K的,就把它分成2塊,11K110K

   把解析過的內容寫進10K

 

 4.10K的塊放到Library cache裡面去,最後把1K的塊放到free空間4K鏈上

 

ORA-4031錯誤(Free空間不足)

硬解析時才會發生去free空間找chunk的動作,如果發生大量的硬解析,會產生很多小chunk,雖然還有空間,但都是小空間,我們不能用,就會發生ORA-4031錯誤

 

產生原因:

 

 1.大量的硬解析

 

 2.大量的硬解析產生很多小chunk,突然又來了一些比較大的SQL語句

   

Library cache 空間(參考上圖)

怎麼寫入Library cache??

首先把SQL語句所有的字母轉換成ASCII值,在進行運算得到一個數字,這個數字就是Library cache鏈上的編號,假如編號是5號,就把free中的塊掛到Library cache5號鏈上

 

   

 

 

 

 

當執行一樣的SQL語句時,Oracle是怎麼知道Library cache裡已經有緩存??

當再次執行這條SQL語句時,Oracle運算後獲得編號一樣是5號,就鎖住Library cache5號鏈,對它進行遍歷,就可以找到剛剛在內存裡的那個塊,就不會發生硬解析了

 

Library cache裡也是一堆鏈,但是跟free的塊管理方式不一樣,他不是以chunk大小串起來的,是以OracleSQL語句運算後的值,掛到鏈上進行組織管理

 

查詢chunk總數,每一個chunk都會產生一個信息,信息放在x$ksmsp表裡

select count(*) from x$ksmsp;

 

 通常不用上面那個,使用這個

顯示軟硬解析的具體狀況

select name,value from v$sysstat where name like 'parse%';

   

 

▌(危險)Library cacherow cache裡面的內容清空

alter system flush shared_pool;

 

 

所有資源作為教學用,無任何商業用途!!

 

    歡迎轉載,但務必註明出處!!

    

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 arkai 的頭像
    arkai

    Game & Web Design

    arkai 發表在 痞客邦 留言(0) 人氣()