平时工作的时候,经常会遇到这种事情,从一个大表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抽取数据方法以及大数据量游标卡住的应对的更多相关文章

  1. 第二篇:智能电网(Smart Grid)中的数据工程与大数据案例分析

    前言 上篇文章中讲到,在智能电网的控制与管理侧中,数据的分析和挖掘.可视化等工作属于核心环节.除此之外,二次侧中需要对数据进行采集,数据共享平台的搭建显然也涉及到数据的管理.那么在智能电网领域中,数据 ...

  2. 1300多万条数据30G论坛大数据优化实战经验小结

    最近由于某大型网站社区论坛运行效率比较低用户反馈论坛有些卡需要对系统进行优化,论坛性能影响了公司的形象还有网站的流量,当然这也会影响到公司的收入,而且后期还需要长期维护网站的社区论坛服务. 1:并发访 ...

  3. Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户

        你正在使用过时的浏览器,Amaze UI 暂不支持. 请 升级浏览器 以获得更好的体验! 深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:1 ...

  4. bat坐拥大数据。数据挖掘/大数据给他们带来什么。

    阿里巴巴CTO即阿里云负责人王坚博士说过一句话:云计算和大数据,你们都理解错了.   实际上,对于大数据究竟是什么业界并无共识.大数据并不是什么新鲜事物.信息革命带来的除了信息的更高效地生产.流通和消 ...

  5. oracle基于3种方法的大数据量插入更新

    过程插入更新的3种方法: a.逐条检查插入或更新,同时执行插入或更新 b.逐条merge into(逐条是为了记录过程日志与错误信息) c.基于关联数组的检查插入.更新,通过forall批量sql执行 ...

  6. Hadoop大数据学习视频教程 大数据hadoop运维之hadoop快速入门视频课程

    Hadoop是一个能够对大量数据进行分布式处理的软件框架. Hadoop 以一种可靠.高效.可伸缩的方式进行数据处理适用人群有一定Java基础的学生或工作者课程简介 Hadoop是一个能够对大量数据进 ...

  7. 利用 StartLoadingStatus 和 FinishLoadingStatus 读取数据特别是大数据时增加渐隐渐显等待特效 - Ehlib学习(三)

    代码很简单: DBGrideh.StartLoadingStatus(' Loading ... '); Sleep(500); DBGrideh.FinishLoadingStatus; 做下变动: ...

  8. 大数据及hadoop相关知识介绍

    一.大数据的基本概念 1.1什么是大数据 互联网企业是最早收集大数据的行业,最典型的代表就是Google和百度,这两个公司是做搜索引擎的,数量都非常庞大,每天都要去把互联网上的各种各样的网页信息抓取下 ...

  9. 大数据和BI商业智能有何区别?有何相关?

    大数据 ≠BI商业智能,大数据也不是传统商业智能的简单升级. 1.大数据和BI两者的区别 BI(BusinessIntelligence)即商业智能,它是企业数据化管理的一整套的方案,用来将企业中现有 ...

随机推荐

  1. Fis3的前端工程化之路[三大特性篇之内容嵌入]

    Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...

  2. Windows server 2012 添加中文语言包(英文转为中文)(离线)

    Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...

  3. 【探索】无形验证码 —— PoW 算力验证

    先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...

  4. 将 instance 部署到 OVS Local Network - 每天5分钟玩转 OpenStack(130)

    上一节创建了 OVS 本地网络 first_local_net,今天我们会部署一个 instance 到该网络并分析网络结构.launch 一个 instance,选择 first_local_net ...

  5. 算法与数据结构(八) AOV网的关键路径

    上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...

  6. PHP中遍历XML之SimpleXML

    简单来讲述一些XML吧,XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.XML是当今用于传输数据的两大工具之一,另外一个是json. 我们在PHP中使用XML也是用来传输数据, ...

  7. ES6的一些常用特性

    由于公司的前端业务全部基于ES6开发,于是给自己开个小灶补补ES6的一些常用特性.原来打算花两天学习ES6的,结果花了3天才勉强过了一遍阮老师的ES6标准入门(水好深,ES6没学好ES7又来了...) ...

  8. web api接口同步和异步的问题

    一般来说,如果一个api 接口带上Task和 async 一般就算得上是异步api接口了. 如果我想使用异步api接口,一般的动机是我在我的方法里面可能使用Task.Run 进行异步的去处理一个耗时的 ...

  9. jQuery幻灯片插件autoPic

    原文地址:Jquery自定义幻灯片插件 插件效果图: 演示地址:autoPic项目地址:autoPic 欢迎批评指正!

  10. spring无法读取properties文件数据

    只讲述异常点,关于怎么配置文件,这里不做说明.   1. controller中无法读取config.properties文件 controller中注入的@Value配置是从servlet-cont ...