首先我這篇博客的內容是我不知道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