在这介绍两个oracle 10G开始提供的一个伪列ORA_ROWSCN,它又分为两种模式一种是基于block,这是默认的模式,还有一种是基于row上,这种模式只能在建里表时指定ROWDEPENDENCIES,不可以通过后期的alter table ,同时会给数据库带来性能负载
每个Block在头部是记录了该block最近事务的SCN的,所以默认情况下,只需要从block头部直接获取这个值就可以了,不需要其他任何的开销,Oracle就能做到这一点。但是这明显第一种模式是scn是不准确的,因为不可能每个事务都能修改整个 块的数据。

在10g之前,很多系统要实现增量数据抽取,要么通过解析日志,要么加触发器,要么就在表上加一个时间截字段。ORA_ROWSCN其实就是第三种方式,只是这个字段由Oracle来维护,这样可以避免一些应用绕过时间截去更新其他字段带来的问题。

下面做一个实验来证明,首先在默认状态下修改同一个块上的其中一条数据,然后再启用行级跟踪,修改同一块上的一条数据,观察ora_rowscn变化

SQL> conn anbob/anbob
Connected.
SQL> create table testscn(
2 id number(5),
3 name varchar2(10),
4 sex number(1),
5 addr varchar2(100)
6 ); Table created. SQL> insert into testscn values(1,’anbob’,’1′,’beijing’); 1 row created. SQL> insert into testscn values(2,’sesebook’,’1′,’beijing’); 1 row created. SQL> insert into testscn values(3,’weejar’,’1′,’beijing’); 1 row created. SQL> commit; Commit complete. SQL> set linesize 150
SQL> select ora_rowscn,id,name,sex,addr from testscn; ORA_ROWSCN ID NAME SEX
———- ———- ——————– ———-
ADDR
——————————————————————————————————————————————————
46007034 1 anbob 1
beijing 46007034 2 sesebook 1
beijing 46007034 3 weejar 1
beijing SQL> col addr for a50
SQL> run
1* select ora_rowscn,id,name,sex,addr from testscn ORA_ROWSCN ID NAME SEX ADDR
———- ———- ——————– ———- ————————————————–
46007034 1 anbob 1 beijing
46007034 2 sesebook 1 beijing
46007034 3 weejar 1 beijing SQL> select ora_rowscn,id,name,sex,addr,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) blockid from testscn; ORA_ROWSCN ID NAME SEX ADDR BLOCKID
———- ———- ——————– ———- ————————————————– ———-
46007034 1 anbob 1 beijing 1429
46007034 2 sesebook 1 beijing 1429
46007034 3 weejar 1 beijing 1429
——–可以看出记录是在同一个block上 SQL> select scn_to_timestamp(ora_rowscn) stime,id,name,sex,addr from testscn; STIME ID NAME SEX ADDR
—————————————- ———- ——————– ———- ————————————————–
16-5月 -11 01.37.54.000000000 下午 1 anbob 1 beijing
16-5月 -11 01.37.54.000000000 下午 2 sesebook 1 beijing
16-5月 -11 01.37.54.000000000 下午 3 weejar 1 beijing SQL> update testscn set sex=0 where id=2; 1 row updated. SQL> commit; Commit complete. SQL> select scn_to_timestamp(ora_rowscn) stime,id,name,sex,addr from testscn; STIME ID NAME SEX ADDR
—————————————- ———- ——————– ———- ————————————————–
16-5月 -11 01.47.21.000000000 下午 1 anbob 1 beijing
16-5月 -11 01.47.21.000000000 下午 2 sesebook 0 beijing
16-5月 -11 01.47.21.000000000 下午 3 weejar 1 beijing
–因为是同一个块上,所以这个块上的所有数据的scn都更新了 第二种模式
SQL> create table testscn2 ROWDEPENDENCIES as select * from testscn; Table created. SQL> select scn_to_timestamp(ora_rowscn) stime,id,name,sex,addr from testscn2; STIME ID NAME SEX ADDR
—————————————- ———- ——————– ———- ————————————————–
16-5月 -11 02.15.42.000000000 下午 1 anbob 1 beijing
16-5月 -11 02.15.42.000000000 下午 2 sesebook 0 beijing
16-5月 -11 02.15.42.000000000 下午 3 weejar 1 beijing SQL> select ora_rowscn,id,name,sex,addr,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) blockid from testscn; ORA_ROWSCN ID NAME SEX ADDR BLOCKID
———- ———- ——————– ———- ————————————————– ———-
46007328 1 anbob 1 beijing 1429
46007328 2 sesebook 0 beijing 1429
46007328 3 weejar 1 beijing 1429 SQL> update testscn2 set sex=0 where id=3; 1 row updated. SQL> commit; Commit complete. SQL> select scn_to_timestamp(ora_rowscn) stime,id,name,sex,addr from testscn2; STIME ID NAME SEX ADDR
—————————————- ———- ——————– ———- ————————————————–
16-5月 -11 02.15.42.000000000 下午 1 anbob 1 beijing
16-5月 -11 02.15.42.000000000 下午 2 sesebook 0 beijing
16-5月 -11 02.16.39.000000000 下午 3 weejar 0 beijing SQL>
 

oracle ORA_ROWSCN 行记录的更新时间的更多相关文章

  1. Oracle多行记录合并的几种方法

    今天正好遇到需要做这个功能,顺手搜了一下网络,把几种方法都列出来,方便以后参考. 1 什么是合并多行字符串(连接字符串)呢,例如: SQL> desc test; Name Type Nulla ...

  2. Oracle 多行记录合并/连接/聚合字符串的几种方法

    怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结.-什么是合并多行字符串(连接字符串)呢,例如: SQL&g ...

  3. Oracle多行记录合并/连接/聚合字符串的几种方法

    怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结.   什么是合并多行字符串(连接字符串)呢,例如:SQL& ...

  4. Oracle多行记录合并自定义函数

    在oracle数据库中,进行字段合并,可以使用wm_concat(column)函数,但是在这种方法不被Oracle所推荐,因为WMSYS用户用于Workspace Manager,其函数对象可能因版 ...

  5. oracle 常用操作记录--持续更新...

    一.oracle grant 授权语句(转自:https://www.cnblogs.com/yt954437595/p/6488819.html) --select * from dba_users ...

  6. Oracle多行记录合并处理

    1:效果如下图所示: 表T1: CREATE TABLE T1 ( WEEKWORKID VARCHAR2(20) , DD VARCHAR2(20) ) 表T2 CREATE TABLE T2 ( ...

  7. oracle数据库学习记录(持续更新中...)

    --------------------------------------------day1------------------------------------------------- 1. ...

  8. Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)

    原帖:http://www.cnblogs.com/nayitian/p/3231734.html wmsys.wm_concat Definition: The Oracle PL/SQL WM_C ...

  9. Oracle数据库更新时间的SQL语句

    ---Oracle数据库更新时间字段数据时的sql语句---格式化时间插入update t_user u set u.name='pipi',u.modifytime=to_date('2015-10 ...

随机推荐

  1. StaggeredGridView+universal-image-loader载入网路图片实现瀑布流

    StaggeredGridView 开源lib  https://github.com/maurycyw/StaggeredGridView 文章demo下载地址  http://download.c ...

  2. git 分支的基本操作

    git分支的基本操作. 创建私有分支:     $git branch branchName commitID     $git checkout -b branchName commitID 注意: ...

  3. android动画效果大全

    动画类型 Android的animation由四种类型组成  Android动画模式 Animation主要有两种动画模式:一种是tweened animation(渐变动画 XML中 JavaCod ...

  4. iOS 之改变状态栏颜色

    1.在工程中找到 info.plist  文件,点击“+”号,选择 View controller-based status bar appearance 并设为 NO 2.在 AppDelegate ...

  5. VLD 1.0 ReadMe翻译尝试

    近期想学习下VLD的实现,打算从最简单的V1.0版本看起.以下是V1.0版本自己尝试翻译下,最新的2.x版本似乎强大了很多. 简介 Visual C++提供了内置的内存检测机制,但其充其量只满足了最小 ...

  6. Qt 'void QWidget::show()' is inaccessible

    今天在编写Qt窗体头文件时,尽然碰到了这样的报错,'void QWidget::show()' is inaccessible,'QWidget' is not an accessible base ...

  7. [转载]OpenSUSE 13.2/13.1 安装搜狗拼音输入法

    1. 添加 M17N 源: 13.2: sudo zypper ar -f http://download.opensuse.org/repositories/M17N/openSUSE_13.2/ ...

  8. Linux下安装MySQL步骤

    1.下载安装包(这里是32位的): MySQL-client-5.6.13-1.rhel5.i386.rpm MySQL-server-5.6.13-1.rhel5.i386.rpm 2.安装 rpm ...

  9. [C++程序设计]返回指针值的函数

    定义指针函数的一般形式为 类型名 *函数名(参数表列); 例如 int *a(int x,int y);

  10. 负载均衡集群之LVS的DR模型详解(Diretor Routing)

    LVS的默认模型:默认模型DR DR模型原理图--> 在讲DR模型要点之前,需要了解网络的相关知识: 接收的报文拆解顺序:帧(MAC)-->数据包(IP)-->数据报文(port) ...