且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Oracle10g与oracle11g中current_scn计算差别

更新时间:2022-05-17 05:27:44

我们知道Oracle10g在v$database视图中引入了current_scn,这个SCN来自底层表,代表当前的SCN,在Oracle9i中我们可以通过dbms_flashback.get_system_change_number来获得系统的SCN。我的版本是oracle11g的。

但是注意current_scn还是有所不同的,看一下一个查询:
SQL> col current_scn for 99999999999999999
SQL> select current_scn from v$database;
       CURRENT_SCN                                                             
------------------                                                             
           1941617                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941650                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941675                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941678                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941683                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941689                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941691                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941762                                                             

SQL> conn system/yang as sysdba
已连接。
SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941780                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941794                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941794                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941795                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941797                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941797                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941798                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941799                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941799                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941799                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941800                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941800                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941801                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941801                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941801                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941802                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941802                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941802                                                             

SQL> select dbms_flashback.get_system_change_number current_scn from dual;

       CURRENT_SCN                                                             
------------------                                                             
           1941803                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941806                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941808                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941809                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941811                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941812                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941814                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941815                                                             

SQL> select current_scn from v$database;

       CURRENT_SCN                                                             
------------------                                                             
           1941817       
                                                      

我们看到current_scn的查询会直接导致SCN的增进,而其他方式并不会,至少执行两次时不会。也就是说在这里的current_scn就像是一个Sequence一样,查询会导致增进。这也很好理解,v$database只能通过增进当前的SCN才能保证获得的SCN是Current的。可是如果不查询呢?这个值肯定是不会增长的。

这里 和盖国强大师 说点不一样。

http://www.eygle.com/archives/2007/06/oracle10g_current_scn.html

有点疑惑?那位朋友能给个解答!先谢谢了。。