楼主: fromeast

利用rowid快速在线更新海量数据

[复制链接]
论坛徽章:
1
ITPUB学员
日期:2010-07-12 15:33:58
71#
发表于 2008-9-11 13:31 | 只看该作者
有这么神奇?!

使用道具 举报

回复
论坛徽章:
0
72#
发表于 2008-9-11 17:02 | 只看该作者
rollingpig 说得非常清楚,谢谢

这样看来
by rowid 和 keep都应该是速度变快的原因

使用道具 举报

回复
论坛徽章:
0
73#
发表于 2008-9-11 17:28 | 只看该作者
学习了。还得自己测测。

使用道具 举报

回复
论坛徽章:
13
数据库板块每日发贴之星
日期:2007-09-20 01:04:22铁扇公主
日期:2012-02-21 15:02:402010新春纪念徽章
日期:2010-03-01 11:08:28月度精华徽章
日期:2009-04-01 02:15:18数据库板块每日发贴之星
日期:2008-05-17 01:02:08生肖徽章2007版:兔
日期:2008-04-07 19:49:48生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44数据库板块每日发贴之星
日期:2007-10-20 01:03:31
74#
发表于 2008-9-11 17:36 | 只看该作者
原帖由 xzh2000 于 2008-9-11 10:48 发表
还有n多种办法提高批量数据处理的速度...
假如需要在2个小时内处理完毕呢?楼主该如何处理?其实用不用rowid,都可以很快地处理完...



讲讲你的n种方法啊。

使用道具 举报

回复
论坛徽章:
10
ITPUB元老
日期:2005-02-28 12:57:002010广州亚运会纪念徽章:保龄球
日期:2011-01-30 11:57:03祖国60周年纪念徽章
日期:2009-10-09 08:28:00参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:鼠
日期:2008-01-02 17:35:53会员2006贡献徽章
日期:2006-04-17 13:46:34授权会员
日期:2005-10-30 17:05:33ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
75#
 楼主| 发表于 2008-9-12 00:13 | 只看该作者
原帖由 xzh2000 于 2008-9-11 10:48 发表
还有n多种办法提高批量数据处理的速度...
假如需要在2个小时内处理完毕呢?楼主该如何处理?其实用不用rowid,都可以很快地处理完...


老和尚不要卖关子啦

使用道具 举报

回复
论坛徽章:
10
ITPUB元老
日期:2005-02-28 12:57:002010广州亚运会纪念徽章:保龄球
日期:2011-01-30 11:57:03祖国60周年纪念徽章
日期:2009-10-09 08:28:00参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:鼠
日期:2008-01-02 17:35:53会员2006贡献徽章
日期:2006-04-17 13:46:34授权会员
日期:2005-10-30 17:05:33ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
76#
 楼主| 发表于 2008-9-12 00:47 | 只看该作者
原帖由 棉花糖ONE 于 2008-9-11 10:44 发表
还不知道是keep住表起作用还是order by rowid起作用了,keep住表当然能减少一些物理读啊


测一次至少需要1个多小时的CURSOR打开时间,而我们的测试组白天黑夜地一直占着测试环境。有机会一定按相同的条件测一下。

不过我觉得KEEP在这个例子里的作用应该不大。表数据只有被访问,才会读到内存里,并不是把表设为KEEP池,就都读进来驻留在内存了--也没那么大的地方把表数据全部装进来。从这一点上来说,DEFAULT池和KEEP池的作用是相同的。ORACLE之所以要设置KEEP池,是提供一种手段,让DBA有机会把不同行为的表分开,使之互不干扰。拿本例来说,设成KEEP是想在生产上执行时,免得其他程序把刚读进来并且还没有处理完的数据块挤出去。但是在当时的测试环境上的负载很低,所以在测试时KEEP应该没起什么作用。这个观点需要实际验证。你也可以构造一个测试环境验证你的想法。

对于方案一(不用order by rowid),反正rowid是乱序的,每次基本上也都是从磁盘读,既然data buffer不起作用,那么用哪个data buffer都一样。

使用道具 举报

回复
论坛徽章:
11
数据库板块每日发贴之星
日期:2007-10-10 01:04:092010新春纪念徽章
日期:2010-01-04 08:33:08祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:马
日期:2009-04-12 17:19:242009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:猪
日期:2008-05-06 11:10:422008新春纪念徽章
日期:2008-02-13 12:43:03生肖徽章2007版:鼠
日期:2008-01-02 17:35:53授权会员
日期:2007-11-02 16:47:52ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
77#
发表于 2008-9-12 09:22 | 只看该作者
我觉得可以改成单条update更新,
首先分配一个巨大的回滚段,那后
update t1 set curr_count = t2.curr_count
from t1,t2 where t1.id2 = t2.id2;


不知道对不对。

使用道具 举报

回复
论坛徽章:
0
78#
发表于 2008-9-12 09:48 | 只看该作者
根据数据字典表中数据块的信息来生成ROWID,然后每次只更新这些数据块中的信息,这样就不需要那么大的CURSOR了,而且每次都是更新几个数据块,也不需要根据ROWID进行排序了,占用系统的资源也应该下降了。

使用道具 举报

回复
论坛徽章:
556
79#
发表于 2008-9-12 10:13 | 只看该作者
keep提高应该是明显的。rowid有没有效果,去掉keep再测试下看看就明白了。

使用道具 举报

回复
论坛徽章:
46
凯迪拉克
日期:2013-08-22 10:00:10Jeep
日期:2013-08-10 07:21:13ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:体操
日期:2008-10-24 13:08:31会员2007贡献徽章
日期:2007-09-26 18:42:10马上加薪
日期:2014-04-11 09:34:11秀才
日期:2015-09-06 10:19:32
80#
发表于 2008-9-12 11:05 | 只看该作者
如果是table full access的话,也会是同一数据块的记录在一起的,只是数据块之间不是顺序的。

应该还是KEEP起的作用。

用了order by ,增加了打开的时间。

使用道具 举报

回复

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

本版积分规则 发表回复

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