V$SESSION的SID&SERIAL#

nathanzhn發表於2014-09-26
最近學習ORACLE優化總想著收集一些高手常用的指令碼(諸多效能檢視關聯來關聯去)直接拿來主義,但是收集多了卻自己記不住,總要去查,反省一下原因,就是因為自己拿來的多,變成自己的東西少,其根源在於沒有紮紮實實地打基礎。
因此今後要從每一個重要的效能檢視入手,把他們的內容、什麼情況下使用、之間的關係等好好搞搞清楚。

先記錄一下關於V$SESSION.SID&SERIAL#的關係,這是我在需要殺掉一個會話時產生的疑問:
alter system kill session 'SID, SERIAL#';
我的疑問是:為什麼需要SERIAL#,不是隻是用SID就能唯一確定一個會話嗎?
網上的到的答案是:
sid 會重用,但是同一個SID被重用時,serial#會增加,不會重複。
比如說你在10:00時發現有一個SID 為10 ,serial#為100的session 不正常,想殺掉他,要是直接用kill sid 10 ,而同時這個session 主動退出,新session近來 而又正好用了 10這個SID (這時新session的serial#不會=100,只會比100高),就會發生誤殺的情況。所以Oracle要求我們在殺session時,必須同時指定sid和serial#.
從另外一個角度上說,sid 在同一個instance的當前session中是一個unique key, 而sid ,serial#則是在整個instance生命期內的所有session中是unique key。(不考慮serial#超過最大值,重用的情況)

例如之前我需要執行alter system kill session '147, 33306';
執行之後,我還在同一個PL/SQL DEV的SQL WINDOW中重新做一個查詢,就會又產生一個SID=147的SESSION,但是此時的SERIAL#變為33308了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26521853/viewspace-1281714/,如需轉載,請註明出處,否則將追究法律責任。

相關文章