使用rowid抽取数据方法以及大数据量游标卡住的应对
平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来。这种时候,一般来说,
做关联查询:
create table A1 as select A.* from 详单表 A,号码表 B wherea.号码 = b.号码
当然这个语句根据情况不一样有很多中写法,但是,不管是哪种写法,这个语句最大的问题是,如果数据量大,你非常纠结他到底能不能跑完,有时候一个事情,要求2个小时干完,现在跑了1个小时,你说到底要不要结束它另外想办法呢?
所以,这种时候,还是让事情可控一点比较好,首先,还是要考虑a字段的特征,如果a字段并集很大,A有上亿,a字段有几百万,这种时候,我们会给a字段建上索引,比如我要抽取1万个号码的详单,这样写其实就很好:
for x in (select 号码 from Bwhere B.状态="未处理") loop
insert into A1 select * from A where a.号码=x.号码 ;
update B set B.状态=已处理 where B.号码=x.号码 ;
commit ;
end loop;
这样的好处,第一你可以看到执行了多少,进度可控,第二,你随时可以停了他继续。下次启动时,前面做完的他就不会继续做了。
但是,当a字段的并集,不是那么大,而是比较小的时候,比如只有十万的时候, 就不怎么舒服了,因为这种时候索引就没那么管用了。当然你还是可以按照上面的方式那样去做,只是会很慢很慢。所以,这个时候考虑完全做一次全表扫描,实际比索引字段查询多次还要快(为了贴近实际,我把这个字段叫做文件名跟上面的号码区分):
for x in (select rowid,文件名 from A)
select count(1) into cc from B where B.文件名=x.文件名 ;
if cc >= 1 then
insert into A1 select * from A where A.rowid=x.rowid;
commit ;
end if ;
end loop;
上面语句中,其实这么写是偷懒的做法,因为要插一条记录去新表A1中,理想的办法当然是在游标中读取所有字段,然后直接insert 到A1中,用insert into A1 values这种,如果写成insert into A1 select * from A where A.rowid=x. rowid会增加IO,实际上,rowid定位一行数据是极快的方法(不管你表有多大,都是一样的效率),这种写法根本不会比insert into A1 values 慢多少。
再次但是,这种场景下,其实是容易出问题,问题出在这个数据量很大,且记录不怎么连续的时候,当记录不怎么连续时,游标fentch到越后面,就越慢。一个亿的记录,没准在几百万的时候就卡住了。出现问题的原因,还是因为记录不够连续,导致寻址变慢,解决的办法,就是重建这个表(或者对这个表做表分析)。
再次再次但是,上亿的表,做表分析也好,还是重建,都不容易,可能重建个几个小时还是建不出来,而且浪费空间。所以,上面那个是想偷懒少些字段的逻辑,就变成了必然,我们考虑重建表的时候,只需要两个字段:
create table A1的映射 nolloggingas select rowid as rrowid , 文件名 from A ;
for x in (select rrowid,文件名 from A1的映射)
select count(1) into cc from B where B.文件名=x.文件名 ;
if cc >= 1 then
insert into A1 select * from A where A.rowid=x.rrowid;
commit ;
end if ;
end loop;
重建表的时候,只用两个字段,可以大大减少重建的时间(create table 其实是获取的数据量越大越慢,还不是线性的,是几何增长的)。然后游标使用新的重建表,读取rowid字段(已经改为了rrowid),在根据获取到的rowid去实际表中获取数据。
要不怎么说,这个世界是懒人推动的呢?
使用rowid抽取数据方法以及大数据量游标卡住的应对的更多相关文章
- 第二篇:智能电网(Smart Grid)中的数据工程与大数据案例分析
前言 上篇文章中讲到,在智能电网的控制与管理侧中,数据的分析和挖掘.可视化等工作属于核心环节.除此之外,二次侧中需要对数据进行采集,数据共享平台的搭建显然也涉及到数据的管理.那么在智能电网领域中,数据 ...
- 1300多万条数据30G论坛大数据优化实战经验小结
最近由于某大型网站社区论坛运行效率比较低用户反馈论坛有些卡需要对系统进行优化,论坛性能影响了公司的形象还有网站的流量,当然这也会影响到公司的收入,而且后期还需要长期维护网站的社区论坛服务. 1:并发访 ...
- Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户
你正在使用过时的浏览器,Amaze UI 暂不支持. 请 升级浏览器 以获得更好的体验! 深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:1 ...
- bat坐拥大数据。数据挖掘/大数据给他们带来什么。
阿里巴巴CTO即阿里云负责人王坚博士说过一句话:云计算和大数据,你们都理解错了. 实际上,对于大数据究竟是什么业界并无共识.大数据并不是什么新鲜事物.信息革命带来的除了信息的更高效地生产.流通和消 ...
- oracle基于3种方法的大数据量插入更新
过程插入更新的3种方法: a.逐条检查插入或更新,同时执行插入或更新 b.逐条merge into(逐条是为了记录过程日志与错误信息) c.基于关联数组的检查插入.更新,通过forall批量sql执行 ...
- Hadoop大数据学习视频教程 大数据hadoop运维之hadoop快速入门视频课程
Hadoop是一个能够对大量数据进行分布式处理的软件框架. Hadoop 以一种可靠.高效.可伸缩的方式进行数据处理适用人群有一定Java基础的学生或工作者课程简介 Hadoop是一个能够对大量数据进 ...
- 利用 StartLoadingStatus 和 FinishLoadingStatus 读取数据特别是大数据时增加渐隐渐显等待特效 - Ehlib学习(三)
代码很简单: DBGrideh.StartLoadingStatus(' Loading ... '); Sleep(500); DBGrideh.FinishLoadingStatus; 做下变动: ...
- 大数据及hadoop相关知识介绍
一.大数据的基本概念 1.1什么是大数据 互联网企业是最早收集大数据的行业,最典型的代表就是Google和百度,这两个公司是做搜索引擎的,数量都非常庞大,每天都要去把互联网上的各种各样的网页信息抓取下 ...
- 大数据和BI商业智能有何区别?有何相关?
大数据 ≠BI商业智能,大数据也不是传统商业智能的简单升级. 1.大数据和BI两者的区别 BI(BusinessIntelligence)即商业智能,它是企业数据化管理的一整套的方案,用来将企业中现有 ...
随机推荐
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密
0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...
- 《你不知道的JavaScript》整理(四)——原型
一.[[Prototype]] JavaScript中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用. var myObject = { a: 2 }; myObje ...
- Servlet监听器笔记总结
监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- openresty 前端开发入门四之Redis篇
这章主要演示怎么通过lua连接redis,并根据用户输入的key从redis获取value,并返回给用户 操作redis主要用到了lua-resty-redis库,代码可以在github上找得到 而且 ...
- CSS3自定义滚动条样式 -webkit-scrollbar(转)
有没有觉得浏览器自带的原始滚动条很不美观,同时也有看到很多网站的自定义滚动条显得高端,就连chrome32.0开发板都抛弃了原始的滚动条,美观多了.那webkit浏览器是如何自定义滚动条的呢? 前言 ...
- Cesium简介以及离线部署运行
Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...
- nexus 社区版3.0.2部署、访问
下载nexus社区办(oss): https://www.sonatype.com/download-oss-sonatype 目前最新版本 nexus-3.0.2-02-win64.zip nex ...
- 如何理解MySQL中auto_increment?
1.auto_increment用于主键自动增长.比如从1开始增长,当把第一条数据删除,再插入第二条数据时,主键值为2,不是1.