
Free 空間(參考上圖)
▌ 只能設定shared pool大小,不能設定內部各個大小
▌ free空間中有鏈(chain)的概念,每條鏈的內存塊大小都是不一樣的,越下面的內存塊越大
▌ oracle為什麼要使用大量的鏈(chain)??
1.把我們需要的內存塊組織(串)起來
2.可以遍歷,鏈有頭有尾,所有的塊都掛在鏈上,可以在鏈上找到每個塊
▌ SQL語句解析過程
1.現在解析了一個SQL語句,在Library cache裡沒有找到緩存的SQL語句
2.根據解析的SQL語句與其執行計畫,和它所需要占用的實際空間,從free空間的鏈上找塊
3.假如我們需要10K的空間,就到free的8K~12K鏈上去找,找到1塊11K的,就把它分成2塊,1塊1K,1塊10K,
把解析過的內容寫進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 cache的5號鏈上
▌當執行一樣的SQL語句時,Oracle是怎麼知道Library cache裡已經有緩存??
當再次執行這條SQL語句時,Oracle運算後獲得編號一樣是5號,就鎖住Library cache的5號鏈,對它進行遍歷,就可以找到剛剛在內存裡的那個塊,就不會發生硬解析了
▌Library cache裡也是一堆鏈,但是跟free的塊管理方式不一樣,他不是以chunk大小串起來的,是以Oracle對SQL語句運算後的值,掛到鏈上進行組織管理
▌查詢chunk總數,每一個chunk都會產生一個信息,信息放在x$ksmsp表裡
select count(*) from x$ksmsp;
▌ 通常不用上面那個,使用這個
顯示軟硬解析的具體狀況
select name,value from v$sysstat where name like 'parse%';
▌(危險)將Library cache和row cache裡面的內容清空
alter system flush shared_pool;
▌所有資源作為教學用,無任何商業用途!!
歡迎轉載,但務必註明出處!!