楼主: fromeast

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

[复制链接]
论坛徽章:
59
狮子座
日期:2016-03-26 13:35:402013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-02-25 11:06:15ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20灰彻蛋
日期:2012-04-25 13:19:33紫蛋头
日期:2012-03-14 11:16:09最佳人气徽章
日期:2012-03-13 17:39:18玉石琵琶
日期:2012-02-21 15:04:38鲜花蛋
日期:2011-11-30 14:13:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
21#
发表于 2008-9-8 09:49 | 只看该作者
-- keep buffer pool 6GB
问下这张表多大?keep池设了多大?

使用道具 举报

回复
论坛徽章:
27
会员2006贡献徽章
日期:2006-04-17 13:46:34奥运会纪念徽章:自行车
日期:2008-09-04 16:35:57数据库板块每日发贴之星
日期:2008-09-24 01:03:37生肖徽章2007版:鼠
日期:2008-11-14 12:38:47生肖徽章2007版:马
日期:2008-11-24 08:53:01生肖徽章2007版:羊
日期:2008-12-05 09:36:23生肖徽章2007版:龙
日期:2008-12-08 09:33:53八级虎吧徽章
日期:2008-12-08 16:10:58数据库板块每日发贴之星
日期:2008-12-09 01:01:05生肖徽章2007版:龙
日期:2009-03-16 17:39:22
22#
发表于 2008-9-8 09:57 | 只看该作者
无它,但机器好而已

使用道具 举报

回复
论坛徽章:
33
ITPUB元老
日期:2009-03-11 15:35:03咸鸭蛋
日期:2011-11-06 22:20:25紫蛋头
日期:2011-12-27 22:15:052012新春纪念徽章
日期:2012-01-04 11:49:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11红宝石
日期:2014-06-03 13:13:19
23#
发表于 2008-9-8 10:10 | 只看该作者
为什么第一种方法不keep呢?

使用道具 举报

回复
论坛徽章:
10
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152011新春纪念徽章
日期:2011-05-06 16:49:002011新春纪念徽章
日期:2011-02-18 11:43:33ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512010新春纪念徽章
日期:2010-03-01 11:07:22生肖徽章2007版:鸡
日期:2009-09-28 12:51:472009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:鼠
日期:2008-01-02 17:35:53劳斯莱斯
日期:2013-12-16 10:42:54
24#
发表于 2008-9-8 10:18 | 只看该作者
对啊,我也觉得是因为你把表keep了进去,所以才会有速度提高的,和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
25#
 楼主| 发表于 2008-9-8 10:22 | 只看该作者
原帖由 棉花糖ONE 于 2008-9-8 09:11 发表
虽然你的那个最后是达到结果了,但是还是没想明白,order by rowid怎么会影响一个块里的行,还有一个问题就是,从你的hint上看也应该是hash join+full table scan+index fast full scan,正常的等待事件应该是sequential scan而非scatter scan


按照ROWID的结构,ROWID的顺序即是数据块的顺序,而CURSOR返回的记录的顺序即是更新的顺序,所以更新就会按数据块的物理顺序依次处理,即更新完一个数据块里的所有行,再更新下一个数据块的数据。这样一来,对于每个数据块,就只有第一行会产生物理读,其他的行,因为数据块已经在内存里了,就只都是逻辑读了。

按数据块的顺序更新可能还有另外一个好处,就是磁盘的顺序读写成本更小,因为磁头减少了磁头的寻道动作。对于单个磁盘肯定是这样,但对于做了条带的RAID是不是也有这个好处,就不清楚了。但有一点是肯定的,就是好的存储设备会根据顺序访问的规律做预读,即监测到顺序访问时,会提前把后续的数据块读入存储的缓存。

CURSOR上的HINT只对CURSOR里的SELECT其作用。从SQL TRACE文件看到的大量的db file sequential read事件是UPDATE语句等待的,不是SELECT语句等待的。

[ 本帖最后由 fromeast 于 2008-9-8 10:37 编辑 ]

使用道具 举报

回复
论坛徽章:
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
26#
 楼主| 发表于 2008-9-8 10:23 | 只看该作者
原帖由 bluemoon0083 于 2008-9-8 09:49 发表
-- keep buffer pool 6GB
问下这张表多大?keep池设了多大?


这张表>60GB。KEEP BUFFER SIZE是6GB。

使用道具 举报

回复
论坛徽章:
27
会员2006贡献徽章
日期:2006-04-17 13:46:34奥运会纪念徽章:自行车
日期:2008-09-04 16:35:57数据库板块每日发贴之星
日期:2008-09-24 01:03:37生肖徽章2007版:鼠
日期:2008-11-14 12:38:47生肖徽章2007版:马
日期:2008-11-24 08:53:01生肖徽章2007版:羊
日期:2008-12-05 09:36:23生肖徽章2007版:龙
日期:2008-12-08 09:33:53八级虎吧徽章
日期:2008-12-08 16:10:58数据库板块每日发贴之星
日期:2008-12-09 01:01:05生肖徽章2007版:龙
日期:2009-03-16 17:39:22
27#
发表于 2008-9-8 10:25 | 只看该作者
KEEP 够大,给个60GB 估计2小时就好了

使用道具 举报

回复
论坛徽章:
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
28#
 楼主| 发表于 2008-9-8 10:26 | 只看该作者
原帖由 duiego 于 2008-9-8 10:18 发表
对啊,我也觉得是因为你把表keep了进去,所以才会有速度提高的,和rowid的顺序读取应该没有关系的吧! 楼主回答一下!


alter table T1 storage (buffer_pool keep)立即就执行结束了,看起来只是改了数据字典,并没有执行读取的动作。这个表有60多GB,而KEEP BUFFER只有6GB,无法装下整张表。

使用道具 举报

回复
论坛徽章:
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
29#
 楼主| 发表于 2008-9-8 10:30 | 只看该作者
原帖由 棉花糖ONE 于 2008-9-8 09:37 发表
楼主order by rowid为什么会起到你说的作用呢,你第一个测试的时候缓存了T1表吗


第一个测试没有把表改到KEEP池,不过我觉得KEEP池对性能的提升作用不大,因为KEEP池只有6GB,而T1却大于60GB。有空我试一下,第一个测试用KEEP池,第二个测试不用KEEP池,各自的效果有什么变化。

使用道具 举报

回复
论坛徽章:
138
19周年集字徽章-19
日期:2020-06-08 08:30:56马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02路虎
日期:2013-11-22 12:26:18问答徽章
日期:2014-05-08 12:15:31
30#
发表于 2008-9-8 10:31 | 只看该作者
原帖由 fromeast 于 2008-9-8 10:22 发表


按照ROWID的结构,ROWID的顺序即是数据块的顺序,而CURSOR返回的记录的顺序即是更新的顺序,所以更新就会按数据块的物理顺序依次处理,即更新完一个数据块里的所有行,再更新下一个数据块的数据。这样一来,对于每个数据块,就只有第一行会产生物理读,其他的行,因为数据块已经在内存里了,就只都是逻辑读了。

CURSOR上的HINT只对CURSOR里的SELECT其作用。从SQL TRACE文件看到的大量的db file sequential read事件是UPDATE语句等待的,不是SELECT语句等待的。


这里的order by rowid应该是不影响一个块里的行的,你第一个做的时候有把表放到keep池吗??

使用道具 举报

回复

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

本版积分规则 发表回复

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