oracle ORA_ROWSCN 行记录的更新时间
在这介绍两个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 行记录的更新时间的更多相关文章
- Oracle多行记录合并的几种方法
今天正好遇到需要做这个功能,顺手搜了一下网络,把几种方法都列出来,方便以后参考. 1 什么是合并多行字符串(连接字符串)呢,例如: SQL> desc test; Name Type Nulla ...
- Oracle 多行记录合并/连接/聚合字符串的几种方法
怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结.-什么是合并多行字符串(连接字符串)呢,例如: SQL&g ...
- Oracle多行记录合并/连接/聚合字符串的几种方法
怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结. 什么是合并多行字符串(连接字符串)呢,例如:SQL& ...
- Oracle多行记录合并自定义函数
在oracle数据库中,进行字段合并,可以使用wm_concat(column)函数,但是在这种方法不被Oracle所推荐,因为WMSYS用户用于Workspace Manager,其函数对象可能因版 ...
- oracle 常用操作记录--持续更新...
一.oracle grant 授权语句(转自:https://www.cnblogs.com/yt954437595/p/6488819.html) --select * from dba_users ...
- Oracle多行记录合并处理
1:效果如下图所示: 表T1: CREATE TABLE T1 ( WEEKWORKID VARCHAR2(20) , DD VARCHAR2(20) ) 表T2 CREATE TABLE T2 ( ...
- oracle数据库学习记录(持续更新中...)
--------------------------------------------day1------------------------------------------------- 1. ...
- Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)
原帖:http://www.cnblogs.com/nayitian/p/3231734.html wmsys.wm_concat Definition: The Oracle PL/SQL WM_C ...
- Oracle数据库更新时间的SQL语句
---Oracle数据库更新时间字段数据时的sql语句---格式化时间插入update t_user u set u.name='pipi',u.modifytime=to_date('2015-10 ...
随机推荐
- "git rm" 和 "rm" 的区别
"git rm" 和 "rm" 的区别 FEB 3RD, 2013 | COMMENTS 这是一个比较肤浅的问题,但对于 git 初学者来说,还是有必要提一下的 ...
- java 中Date的格式化样式
public static void main(String[] args) { Date d = new Date(); System.out.println(d); // Date类的默认格式 T ...
- Python进阶之路---1.1python简介
Python简介 Python简介 Python (发音:[ 'paiθ(ə)n; (US) 'paiθɔn ]n.蟒蛇,巨蛇 ),是一种面向对象的解释 ...
- [HeadFist-HTMLCSS学习笔记][第五章认识媒体]
图像格式 PNG 多种颜色透明 无损压缩 PNG-8,PNG-16,PNG-32 多用于logo GIF 动画 256色 无损 JPEG 不能透明 多用于照片 img URL能插入 alt属性 = 如 ...
- char值码对应大全
Char("0") 为0的字符Char("1") Char("2") Char("3") Char("4&qu ...
- vs2013 JS代码提示
1.JS提示 在Js文件头部加 /// <reference path="ext-all-dev.js" /> 要求引用的js和本js在同一目录,否则需要全部路径
- PHP学习笔记二十六【类的重载】
<?php //重载: //函数名一样,通过函数的参数个数或者是参数类型不同,达到调用同一个函数名 Class A{ // public function test1(){ // echo &q ...
- 最大流EK算法模板
最近学了下最大流算法,大概思想算是懵懵懂懂了,现在想把模板记录下来,以备后面深刻学习之用. #include<cstdio> #include<cstring> using n ...
- git操作流程
- debian 64位系统中添加对32位的支持
dpkg --add-architecture i386 apt-get update apt-get install ia32-libs