|
|
关于scn: 0x0000.018823f7的猜测
select max(ktuxescnw * power(2, 32) + ktuxescnb) from x$ktuxe;
ktuxescnw 正好是表示高位的 2 bytes 0x0000 ,
ktuxescnb 正好是低位的 4bytes
4 bytes 能表示的最大数正好是 power(16,8) = power(2,32) = 4294967296
至于 SCN 为什么要这样分开来存储,偶的猜想是 4294967296 正好是 C 中的long 型整数的最大值,也就是 long 是 4字节存储
而 integer 是2 bytes存储,这样就有
SQL> select power(2,16) from dual;
POWER(2,16)
-----------
65536
考虑到integer 分正负,则最大是
SQL> select power(2,16)/2 from dual;
POWER(2,16)/2
-------------
32768
所以在c里面integer 最大是 32768
而 long 型的正整数类型就是 4294967296
于是进而猜测由于 oracle 早先大部分书C写的,使用 double 似乎不好,使用 long 为 SCN 的编号,这样存在着 有可能不够用的可能,就采取了这种折中方案
SQL> select power(16,8)/366/24/3600 from dual;
POWER(16,8)/366/24/3600
-----------------------
135.820409
偶这样解释这个问题,不知道 Yong Huang 有什么看法  |
|