ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 4986|回复: 5

请问scn_to_timestamp转换到时间戳为什么只能转换到秒级别?而不能转换到毫秒级别?

[复制链接]
论坛徽章:
2
妮可·罗宾
日期:2016-11-29 22:14:05秀才
日期:2016-12-21 16:55:07
发表于 2017-6-12 03:36 | 显示全部楼层 |阅读模式
本帖最后由 yueli34 于 2017-6-12 03:38 编辑

请问scn_to_timestamp转换到时间戳为什么只能转换到秒级别?
11g以后不是一秒钟能产生32k个scn么?为什么scn转换为时间戳的时候实际只转换为了date类型,都不带小数秒?
70万条数据的一个测试表,数据全部update一遍。使用set time on查看执行时间,一共使用近2分钟。

测试版本为11.2.0.4,如下:
create table otest as select level obj_id,"obj"||level obj_name from dual connect by level<=700000;

update test set obj_id=obj+1;//使用set time on查看update语句执行了近2分钟
commit;
select ora_rowscn,scn_to_timestamp(ora_rowscn) from otest;
spool了70万行结果,共产生2个scn;
SQL> select distinct ora_rowscn from otest;
ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)                                                                     
---------- ---------------------------------------------------------------------------


2016315 08-MAR-17 07.51.43.000000000 AM
2016710 08-MAR-17 07.53.02.000000000 AM

问题1:一条语句执行了1分多钟,为什么只产生了2个scn?
问题2:请问是为什么转换出来的时间戳都是整数秒呢?通过该查询语句看时间戳精度位9,是最高精度。可是为什么是9个0呢?为什么不能转换到毫秒甚至更小单位呢?
SQL> select scn_to_timestamp(2016315) from dual;
SCN_TO_TIMESTAMP(2016315)
---------------------------------------------------------------------------
08-MAR-17 07.51.43.000000000 AM


SQL> select scn_to_timestamp(2016316) from dual
SCN_TO_TIMESTAMP(2016316)
---------------------------------------------------------------------------
08-MAR-17 07.51.47.000000000 AM


SQL> select scn_to_timestamp(2016317) from dual
SCN_TO_TIMESTAMP(2016317)
---------------------------------------------------------------------------
08-MAR-17 07.51.47.000000000 AM


SQL> select scn_to_timestamp(2016318) from dual;
SCN_TO_TIMESTAMP(2016318)
---------------------------------------------------------------------------
08-MAR-17 07.51.47.000000000 AM

论坛徽章:
180
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39马上有车
日期:2014-02-18 16:41:11马上有钱
日期:2014-11-24 15:17:08马上有钱
日期:2014-11-12 09:33:24马上有房
日期:2014-11-07 08:46:05马上有钱
日期:2014-10-27 09:26:57马上有对象
日期:2014-10-28 10:28:08itpub13周年纪念徽章
日期:2014-10-10 10:38:25马上有对象
日期:2015-01-14 17:33:15
发表于 2017-6-12 08:30 | 显示全部楼层
那个本身就不准确的,通过1个表转换的,3秒的误差,无法精确到毫秒.

使用道具 举报

回复
论坛徽章:
116
现任管理团队成员
日期:2011-05-07 01:45:08娜美
日期:2017-08-29 10:15:28
发表于 2017-6-12 09:49 | 显示全部楼层
首先 每秒32K的scn增长你是从什么地方得到的?我知道的oracle scn增长每秒允许的值是16348~

scn的增长和时间的流逝是不一样的,时间的流逝是无论你是否做事情,时间都会流逝,而oracle的scn,仅仅在发生改变且提交改变时才会增加(改变包括内部和用户两种类型),如果我们将内部改变去掉,只有你commit一个事务时,scn才会+1,你修改了10万行数据,但是一次提交,scn仅仅+1,所以你说的“一条语句执行了1分多钟,为什么只产生了2个scn”是完全正常的。你不提交的话,scn根本不会增长(当然是排除掉内部事务的前提下)

scn_to_timestamp函数是基于一个定期记录24小时内scn和真实时间对应关系的一个数据字典表来完成转换的。这表的更改是定期的,而不是实时的(当初10g的时候这表的定时是几分钟,比现在要间隔大得多)

使用道具 举报

回复
论坛徽章:
116
现任管理团队成员
日期:2011-05-07 01:45:08娜美
日期:2017-08-29 10:15:28
发表于 2017-6-12 09:50 | 显示全部楼层
如果你想看真正的scn增长,根本不应该去用函数转换,应该去trace redo或者dump archivelog,里面是真正的scn增长。总的来说数据库的scn和真实时间本身就没有固定关系,只不过提供了一个数据字典表,让你大概的可以将两个不相干的值进行近似匹配而已~

使用道具 举报

回复
论坛徽章:
2
妮可·罗宾
日期:2016-11-29 22:14:05秀才
日期:2016-12-21 16:55:07
 楼主| 发表于 2017-6-12 15:45 | 显示全部楼层
本帖最后由 yueli34 于 2017-6-12 15:50 编辑
zergduan 发表于 2017-6-12 09:49
首先 每秒32K的scn增长你是从什么地方得到的?我知道的oracle scn增长每秒允许的值是16348~

scn的增长和 ...

网上说是某个mos里看的,请求证一下:
Installing,Executing and Interpreting output from the “scnhealthcheck.sql” script [ID1393363.1]
中的提到的Patch:13498243中提供的脚本看到。
那么SCN每秒最大可能增长速率是多少呢,这个跟Oracle版本有一定的关系,在11.2.0.2之前是16384(即16K),在11.2.0.2版本是32768(即32K)。在11.2.0.2的版本中有一个隐含参数,_max_reasonable_scn_rate,其默认值就是32768(不建议调整这个值)。

使用道具 举报

回复
论坛徽章:
116
现任管理团队成员
日期:2011-05-07 01:45:08娜美
日期:2017-08-29 10:15:28
发表于 2017-6-12 15:51 | 显示全部楼层
yueli34 发表于 2017-6-12 15:45
网上说是某个mos里看的,请求证一下:
Installing,Executing and Interpreting output from the “scnhe ...

哦,原来是后来修改了
来自苹果客户端来自客户端

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表