oracle序列中cache和nocache


首先我這篇博客的內容是我不知道oracle里的 cache 是什么,結果越查越多。。。

“序列的cache通常為 20,但在需要依據序列值判斷創建的先后順序時必須是 NOCACHE”,關於這句話,是公司的數據庫規范里提到的一句話,但是我感覺nocache會導致的問題好像還不少,所以我很糾結,但是除了根據序列值判斷創建的先后順序外,還有其他的靠譜的方式來判斷先后順序嗎?難道入庫時間不可以嗎?為什么非要用序列值?

好,上面的廢話可以先忽略。主要內容如下:

create    sequence    name     
increment    by    x    //x為增長間隔     
start    with      x    //x為初始值     
maxvalue          x    //x為最大值       
minvalue          x    //x為最小值     
cycle                 //循環使用,到達最大值或者最小值時,從新建立對象     
cache             x    //制定存入緩存(也就是內存)序列值的個數  或者 nocache

如:

create sequence SEQ_ID  
minvalue 1  
maxvalue 99999999  
start with 1  
increment by 1  
cache n  / nocache  --其中n代表一個整數,默認值為20
order;

序列是一數據庫對象,利用它可生成唯一的整數。一般使用序列自動地生成主碼值。一個序列的值是由特別的Oracle程序自動生成。
如果不設定cycle循環的話,每一個序列號是唯一的。 當一個序列號生成時,序列是遞增

當使用到序列的事務發生回滾。會造成序列號不連續。

cache的作用:當大量語句發生請求,申請序列時,為了避免序列在運用層實現序列而引起的性能瓶頸。Oracle序列允許將序列提前生成 cache x個先存入內存,
在發生大量申請序列語句時,可直接到運行最快的內存中去得到序列。但cache個數也不能設置太大,因為在數據庫重啟時,會清空內存信息,預存在內存中的序列會丟失,
當數據庫再次啟動后,序列從上次內存中最大的序列號+1 開始存入cache x個。
比如你的sequence中cache 100,那當你sequence取到90時突然斷電,那么在你重啟數據庫后,sequence的值將從101開始。

另外:
如果指定NOCACHE值,Oracle就不會預先在內存里面存放Sequence。
會產生的問題:創建nocache   sequence在高並發訪問時,容易導致row cache lock等待事件,主要原因是每次獲取nextval時都需要修改rowcache中的字典信息。使用nocache  sequence,還會導致如下問題:
由於每次修改字典信息都需要commit,可能導致log file sync等待,nocache sequence在RAC環境下,會對基於sequence生成的列創建的索引造成實例間大量索引塊爭用
基於以上問題,避免創建nocache sequence。

什么是 log file sync等待事件,在一個提交(commit)十分頻繁的數據庫中,一般會出現log file sync等待事件,當這個等待事件出現在top5中,這個時侯我們需要針對log file sync等待事件進行優化,一定要盡快分析並解決問題,否則當log file sync等待時間從幾毫秒直接到20幾毫秒可能導致系統性能急劇下降,甚至會導致短暫的掛起。

log file sync的原凶到底是什么?
頻繁commit/rollback或磁盤I/O有問題,大量物理讀寫爭用

參考的博客文章:
https://www.cnblogs.com/jhlong/p/6069701.html
https://blog.csdn.net/duanning397/article/details/7670302

下面這篇博客里的內容對 log file sync等待事件做了很多解釋,而且還提到了解決的辦法。可以參考。
http://www.cnblogs.com/iyoume2008/p/7691025.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM