2016年11月11日 星期五

DMV中的時間值欄位為負數



有時候我們會發現,一些系統DMV中的時間值(單位亳秒)欄位為負數,如下圖





















以 sys.dm_exec_requests 的 total_elapsed_time 為例,它是一個int
範圍是:–2,147,483,648 到 2,147,483,647

正常情況下,它是一個正整數值,從0 ~ 2147483647
二進位表示為 00000000 00000000 00000000 00000000 ~ 01111111 11111111 11111111 11111111

但如果一個query執行時間,超過 2147483647 ,再往上加1,就會變成
10000000 00000000 00000000 00000000
上面這個值,在int的型態中,就表示「負數」,依照「二補數」的算法,其值為 -2147483648(第一位為1,表示負數)

所以一旦它的執行時間超過了2147483647 ,就會開始從-2147483648遞增至 0.

因此,像是這類型態的欄位值,其數字週期,如下所示:
0 → 2147483647 → -2147483648 → 0 → 循環往復

查詢這類型態的欄位值,如果不加轉換,直接取其值的話,就有可能會得到上面那張圖所看到的負值。
像這樣的值,可以用下列的語法來查詢
case 
when [欄位名] < 0 
then 2147483647+(2147483649+[欄位名]) 
else [欄位名] 
end as [欄位別名]

像上面的數字週期所示,從0開始累積最後再到0,大約是48天。但如果它的值真的夠大,超過了48天,又進入循環往復了。那麼就查不出其真正的值了。







沒有留言:

張貼留言