關於oracle session的簡單測試

dbhelper發表於2014-11-26

平時檢視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<2);
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

       SID    SERIAL#
---------- ----------
257         95

1

       SID    SERIAL#
---------- ----------
257         97
動態調整間隔時間為3秒,發現沒有任何的改變。

       SID    SERIAL#
---------- ----------
       257        137

3

       SID    SERIAL#
---------- ----------
       257        139

3

       SID    SERIAL#
---------- ----------
       257        141

在我重新調整了時間,從3秒調整到10秒,還是沒有改變,然後調整為30秒的時候。發現sid發生了變化,而且serial#不是從1開始遞增。

 

10

       SID    SERIAL#
---------- ----------
       257        167

10

       SID    SERIAL#
---------- ----------
      257        169

30

       SID    SERIAL#
---------- ----------
       258        515

30

       SID    SERIAL#
---------- ----------
       258        517

 

然後sid開始固定,serial#開始遞增

       SID    SERIAL#
---------- ----------
       258        565

30

       SID    SERIAL#
---------- ----------
        21         31

30

 

我在想不是serial#有個臨界值之類的。

於是把間隔時間調整為0秒。

結果serial#遞增到1500多還是沒有任何反應。然後由0秒調整為3秒後的變化如下:

       SID    SERIAL#
---------- ----------
        21       1603

0

       SID    SERIAL#
---------- ----------
        21       1605

3

       SID    SERIAL#
---------- ----------
        21       1607

3

       SID    SERIAL#
---------- ----------
        21       1609

3

       SID    SERIAL#
---------- ----------
        21       1611

3

       SID    SERIAL#
---------- ----------
       253        135

 

 

       SID    SERIAL#
---------- ----------
       253        175

3

       SID    SERIAL#
---------- ----------
       257        175

如果觀察足夠仔細,就會發現最後的sid為257的session在最開始的時候已經用過,只是serial#部分不同,新建的session 257,175和之前的部分也沒有衝突,是從上一次中斷的那個serial#值開始的。

林林總總做了一圈測試,發現session的sid,serial#有如下的基本規律。

serial#按照2的頻度進行遞增。

serial#的分配由資料庫自動控制,有點類似連線池的味道,下次某個session在sid相同的情況下,serial#會從上一次的值開始繼續遞增。

sid的變化在一定的時間範圍內沒有明顯的規律。

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

相關文章