平時檢視v$session的時候要定位一個session,需要sid,serial#這個兩個值,其實更多時候我們關注更多的是sid,對于serial#卻不太了解。
至少從v$mystat中,可以看到,是隻能定位到sid的,對于serial#的值還需要借助v$session來查找。
SQL> desc v$mystat
Name Null? Type
----------------------------------------- -------- ----------------------------
SID NUMBER
STATISTIC# NUMBER
VALUE NUMBER
有時候看着sid,serial#的變化,想可能裡面有一定的規律,今天還是下決心寫個程式自己簡單測試下,測試結果僅供參考。
我寫了如下的腳本,
-rw-r--r-- 1 ora11g dba 57151 Sep 15 08:11 check.log
-rw-r--r-- 1 ora11g dba 183 Sep 15 07:52 check.sh
-rw-r--r-- 1 ora11g dba 45 Sep 15 07:53 loop.sh
-rw-r--r-- 1 ora11g dba 2 Sep 15 08:05 sleep_time.par
[ora11g@rac1 chk_session]$
loop.sh的内容很簡單就是循環調用check.sh,然後寫入日志check.log
while true
do
ksh check.sh >> check.log
done
check.sh的内容也很簡單,就是每次使用sqlplus來建立一個session。然後sleep一定的時間。
sleep_time=`cat sleep_time.par`
sqlplus -s n1/n1
select sid,serial# from v\$session where sid=(select sid from v\$mystat where rownum
EOF
echo $sleep_time
sleep $sleep_time
為了能夠更加靈活的控制建立session之後的sleep時間,我們可以動态的修改sleep的時間,具體的值在sleep_time.par中,可以動态修改。
[ora11g@rac1 chk_session]$ cat sleep_time.par
3
有了如上的準備工作,來看看輸出的check.log的内容吧。可以看到在1秒的間隔時間下,重新建立的session的sid不會發生變化,而serial#會按照2的間隔遞增。
SID SERIAL#
---------- ----------
257 93
1
257 95
257 97
動态調整間隔時間為3秒,發現沒有任何的改變。
257 137
257 139
257 141
在我重新調整了時間,從3秒調整到10秒,還是沒有改變,然後調整為30秒的時候。發現sid發生了變化,而且serial#不是從1開始遞增。
10
257 167
257 169
30
258 515
258 517
然後sid開始固定,serial#開始遞增
258 565
21 31
我在想不是serial#有個臨界值之類的。
于是把間隔時間調整為0秒。
結果serial#遞增到1500多還是沒有任何反應。然後由0秒調整為3秒後的變化如下:
21 1603
21 1605
21 1607
21 1609
21 1611
253 135
253 175
257 175
如果觀察足夠仔細,就會發現最後的sid為257的session在最開始的時候已經用過,隻是serial#部分不同,建立的session 257,175和之前的部分也沒有沖突,是從上一次中斷的那個serial#值開始的。
林林總總做了一圈測試,發現session的sid,serial#有如下的基本規律。
serial#按照2的頻度進行遞增。
serial#的配置設定由資料庫自動控制,有點類似連接配接池的味道,下次某個session在sid相同的情況下,serial#會從上一次的值開始繼續遞增。
sid的變化在一定的時間範圍内沒有明顯的規律。