楼主: fromeast

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

[复制链接]
论坛徽章:
2
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
81#
发表于 2008-9-15 19:39 | 只看该作者
rowid也好,keep也罢,还有老和尚的方法,都没说明透彻。加精华值得商榷。

使用道具 举报

回复
论坛徽章:
14
授权会员
日期:2007-10-28 17:13:06祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:羊
日期:2009-09-10 11:27:42生肖徽章2007版:鼠
日期:2009-03-10 21:32:40生肖徽章2007版:马
日期:2009-03-10 21:28:53生肖徽章2007版:牛
日期:2009-03-10 21:19:32生肖徽章2007版:羊
日期:2009-03-10 21:16:04奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21生肖徽章2007版:鸡
日期:2008-10-18 21:30:18数据库板块每日发贴之星
日期:2008-10-13 01:02:26
82#
发表于 2008-9-15 20:30 | 只看该作者
原帖由 棉花糖ONE 于 2008-9-8 08:39 发表
在第一个里没看到你缓存T1表啊,想不明白这里有了order by rowid怎么会起到你说的那作用,order by rowid怎么会影响一个数据块里的数据呢???



rowid 排序的话,相同块的数据就会排在一起更新,这样就避免了数据读进来只更新一部分数据,然后又换出,更新另一部分时又要调进来。我想楼主是这个意思吧。

使用道具 举报

回复
论坛徽章:
14
授权会员
日期:2007-10-28 17:13:06祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:羊
日期:2009-09-10 11:27:42生肖徽章2007版:鼠
日期:2009-03-10 21:32:40生肖徽章2007版:马
日期:2009-03-10 21:28:53生肖徽章2007版:牛
日期:2009-03-10 21:19:32生肖徽章2007版:羊
日期:2009-03-10 21:16:04奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21生肖徽章2007版:鸡
日期:2008-10-18 21:30:18数据库板块每日发贴之星
日期:2008-10-13 01:02:26
83#
发表于 2008-9-15 20:31 | 只看该作者
原帖由 TO_TO_RO 于 2008-9-8 09:05 发表
根据表中字段的特点比如idx=aa,idx=bb....将小的表分割,直接UPDATE呢?
另外,游标里面每隔1000行就commit一次也是忌讳的。容易引起“快照太旧”错误



同意,尤其是楼主数据量那么大一次性更新,很容易引起这个问题

使用道具 举报

回复
论坛徽章:
14
授权会员
日期:2007-10-28 17:13:06祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:羊
日期:2009-09-10 11:27:42生肖徽章2007版:鼠
日期:2009-03-10 21:32:40生肖徽章2007版:马
日期:2009-03-10 21:28:53生肖徽章2007版:牛
日期:2009-03-10 21:19:32生肖徽章2007版:羊
日期:2009-03-10 21:16:04奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21生肖徽章2007版:鸡
日期:2008-10-18 21:30:18数据库板块每日发贴之星
日期:2008-10-13 01:02:26
84#
发表于 2008-9-15 20:39 | 只看该作者
原帖由 nyfor 于 2008-9-11 09:44 发表
谢谢, 增长了知识, 但是楼主依然没有说明在第一种情况下,
在 alter table T1 storage(buffer_pool keep);   
之后的速度怎么样, 是否第二种方法的 按 rowid 排序取到了非常重要的作用.



keep池只是用于缓存频繁需要的数据而已,如果楼主使用rowid排序的话,每个块只需要读入一次就可以了,这与使用不使用keep没有多大关系。

使用道具 举报

回复
论坛徽章:
14
授权会员
日期:2007-10-28 17:13:06祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:羊
日期:2009-09-10 11:27:42生肖徽章2007版:鼠
日期:2009-03-10 21:32:40生肖徽章2007版:马
日期:2009-03-10 21:28:53生肖徽章2007版:牛
日期:2009-03-10 21:19:32生肖徽章2007版:羊
日期:2009-03-10 21:16:04奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21生肖徽章2007版:鸡
日期:2008-10-18 21:30:18数据库板块每日发贴之星
日期:2008-10-13 01:02:26
85#
发表于 2008-9-15 20:45 | 只看该作者
原帖由 棉花糖ONE 于 2008-9-11 11:30 发表


别这么肯定,能举个例子吗



order by rowid后块中的数据都是连续更新的,而不是分散更新,当然比之前分散更新的要块。

比如你更新一个块上面的10和20这两条记录,如果没有 使用 rowid的话,那么这两条记录就不一定会排序在一起,因此,当你更新10记录后,假设块被换出了,而你更新20记录时又要把块读进来。

相反地,用了 rowid 后10和20这两条记录就会先后更新,这样就不存在相同块被多次读入内存的情况。

至于 keep pool 有没有作用,我想如果没有使用 rowid的情况下作用是很明显的,因为它减少了块被换出的可能性;如果是使用rowid的情况,因为更新的块只要读入一次后就不要了,所以影响不明显,甚至毫无作用可言。

以上见解,请多指教。

使用道具 举报

回复
论坛徽章:
0
86#
发表于 2008-9-16 15:35 | 只看该作者
个人之见,请各位指正

1.用keep 对数据读取起了作用,缓存了源数据,
看法:oracle是不是很聪明地只载入用到的6G,依次序加载数据?应该是,但cache buffer 太大了,6G差不多10%的数据,对冷数据没有影响,处理速度会很快,到热点数据影响很大,会引起问题,对条带化的存储,问题也表现成散开了,定期程序死了
方法:减少 keep buffer =100M
        或用T1.id2 分段取出更新,类似分页原理

问题:为什么不同时keep T1/T2呢?


2.order by 我觉得是在写数据库是起了作用,更新一个地方,不用跑很多地方做一点事情,事情集中在一块完成!
看法:我猜测这个应用是个交易应用,你用1000 commit,是怕影响前台,对已经cache的数据处理量,一定可以加大 batch commit 10000 合适不?
你的机器性能能足够保证这个batch commit.

方法:加大batch commit. 以保证读取一批,处理一批,保存一批,流程匹配、干净利落

请高人拍砖!

使用道具 举报

回复
论坛徽章:
0
87#
发表于 2008-9-18 14:28 | 只看该作者
学习中

使用道具 举报

回复
论坛徽章:
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
88#
 楼主| 发表于 2008-9-18 17:12 | 只看该作者
原帖由 yaocf 于 2008-9-16 15:35 发表
个人之见,请各位指正

1.用keep 对数据读取起了作用,缓存了源数据,
看法:oracle是不是很聪明地只载入用到的6G,依次序加载数据?应该是,但cache buffer 太大了,6G差不多10%的数据,对冷数据没有影响,处理速度会很快,到热点数据影响很大,会引起问题,对条带化的存储,问题也表现成散开了,定期程序死了
方法:减少 keep buffer =100M
        或用T1.id2 分段取出更新,类似分页原理

问题:为什么不同时keep T1/T2呢?


2.order by 我觉得是在写数据库是起了作用,更新一个地方,不用跑很多地方做一点事情,事情集中在一块完成!
看法:我猜测这个应用是个交易应用,你用1000 commit,是怕影响前台,对已经cache的数据处理量,一定可以加大 batch commit 10000 合适不?
你的机器性能能足够保证这个batch commit.

方法:加大batch commit. 以保证读取一批,处理一批,保存一批,流程匹配、干净利落

请高人拍砖!


回yaocf:没错,1000 rows/commit是因为怕影响前台。1万条一次commit,可能会锁记录长达1秒,影响比较大。

使用道具 举报

回复
论坛徽章:
57
秀才
日期:2017-08-18 11:06:452012新春纪念徽章
日期:2012-01-04 11:50:44ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152011新春纪念徽章
日期:2011-02-18 11:43:33ITPUB9周年纪念徽章
日期:2010-10-08 09:28:532010新春纪念徽章
日期:2010-03-01 11:06:132010年世界杯参赛球队:朝鲜
日期:2010-02-22 16:02:522010年世界杯参赛球队:荷兰
日期:2010-02-22 12:53:212010年世界杯参赛球队:瑞士
日期:2010-01-21 17:04:522010年世界杯参赛球队:法国
日期:2010-01-21 12:44:59
89#
发表于 2008-9-18 18:05 | 只看该作者

re

22小時并不是一個理想的方案。

使用道具 举报

回复
论坛徽章:
2
奥运会纪念徽章:摔跤
日期:2008-09-08 23:22:58奥运会纪念徽章:足球
日期:2008-09-17 19:34:15
90#
发表于 2008-9-18 18:07 | 只看该作者
原帖由 Tomac 于 2008-9-18 18:05 发表
22小時并不是一個理想的方案。

那你说个理想的方案吧?

使用道具 举报

回复

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

本版积分规则 发表回复

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