在分析ORACLE的AWR報告時,發現SQL ordered by Executions(記錄了按照SQL的執行次數排序的TOP SQL。該排序可以看出監控範圍内的SQL執行次數)下有一個SQL語句執行非常頻繁,一個小時執行了上萬次:
update seq$ set increment$=:2, minvalue=:3, maxvalue=:4, cycle#=:5, order$=:6, cache=:7, highwater=:8, audit$=:9, flags=:10 where obj#=:1
那麼seq$這個資料字典表是做什麼用的呢? 其實這個資料字典表是儲存的是資料庫下序列對象(SEQUENCE)的相關資訊,而且它用來維護序列的變化。如下所示,我們通過實驗來驗證一下,我們啟用10046事件,跟蹤一下會話(level=4 表示啟用SQL_TRACE并捕捉跟蹤檔案中的綁定變量),我們跟蹤會話建立序列的過程。下面測試環境為Oracle 11g
使用tkprof将跟蹤檔案轉換成可讀格式的檔案後,你會注意到:在建立序列時,會往資料字典表seq$中插入一條記錄(其實建立序列的本質就是在seq$和obj$中插入了一條記錄),如下截圖所示:

tkprof格式化後的輸出檔案裡面,沒有綁定變量,在原始跟蹤檔案gsp_ora_28201.trc中,你可以看到對應綁定變量的值
使用下面腳本,你就會發現這個都是對應序列對象的一些資訊(序列對象的OBJECT_ID、MINVALUE、MAXVALUE、CACHE等等)
那麼,我們接下來使用SQL TRACE看看使用SEQUENCE時,會對seq$表有啥操作。如下所示,我們在啟用SQL_TRACE後,執行3次該SQL語句
在跟蹤檔案中(具體過程跟上面檢視跟蹤檔案類似,在此忽略具體過程),你會看到也對seq$做了三次更新,更新HIGHWATER的值。
update seq$ set increment$=:2,minvalue=:3,maxvalue=:4,cycle#=:5,order$=:6,
cache=:7,highwater=:8,audit$=:9,flags=:10
where
obj#=:1
那麼我們接下來,我們修改序列CACHE屬性的值,然後重複上面操作,如下所示,在跟蹤檔案裡面,你會看到隻更新了seq$一次,其實更新seq$的更新次數是跟CACHE的值有關系的。是以适當的使用CACHE,是可以減少更新seq$資料字典表的次數。
那麼我們接下來建立一個表,然後循環遞歸調用序列,然後生成對應時間段的AWR報告,我們來重制一下生産環境遇到的問題:
如下所示,你看到INSERT語句執行了50000次,而更新seq$執行了5000次,因為上面測試将序列的CACHE設定為10了,如果沒有設定CACHE,那麼序列被調用50000次,更新seq$對象也将更新50000次。
另外,調用序列也會有一些redo log開銷,如下測試所示,我們先将序列設定為NOCACHE,然後測試過程發現,每次執行都有900多大小的redo log生成。
如果使用CACHE的sequence對象而言,redo size生成的頻率顯然是低得多。如下所示,測試三次,隻有第一次生成了redo log, 當然這個是跟序列的CACHE值有關,當緩存的序列值使用完了,生成新的序列值緩存時,也會産生redo log。
另外一個問題就是,如果序列是NOCACHE,并發調用序列時, 那麼也會産生row lock contention, 是以給序列設定一個合适的CACHE值是有很大好處的,既能減少redo log的産生,也能避免減少row lock contention(并發更新seq$同一行記錄)。但是序列設定了CACHE後,也有可能遇到跳号問題。那麼這個就需要根據實際情況酌情考慮處理了。
<b>參考資料:</b>
<a href="https://asktom.oracle.com/pls/asktom/f?p=100:11:451611870226342::::P11_QUESTION_ID:2985886242221">https://asktom.oracle.com/pls/asktom/f?p=100:11:451611870226342::::P11_QUESTION_ID:2985886242221</a>
<a href="http://www.xifenfei.com/forum/performance/%E5%85%B3%E4%BA%8Eoracle-sequence%E4%B8%80%E4%BA%9B%E5%B0%8F%E6%B5%8B%E8%AF%95">http://www.xifenfei.com/forum/performance/%E5%85%B3%E4%BA%8Eoracle-sequence%E4%B8%80%E4%BA%9B%E5%B0%8F%E6%B5%8B%E8%AF%95</a>