平时工作的时候,经常会遇到这种事情,从一个大表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. SQL Server相关书籍

    SQL Server相关书籍 (排名不分先后) Microsoft SQL Server 企业级平台管理实践 SQL Server 2008数据库技术内幕 SQL Server性能调优实战 SQL S ...

  2. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  3. C#高性能TCP服务的多种实现方式

    哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...

  4. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

  5. JavaScript Object对象

    目录 1. 介绍:阐述 Object 对象. 2. 构造函数:介绍 Object 对象的构造函数. 3. 实例属性:介绍 Object 对象的实例属性:prototype.constructor等等. ...

  6. Linux下Nodejs安装(完整详细)

    之前安装过windows下以及Mac下的node,感觉还是很方便的,不成想今天安装linux下的坑了老半天,特此记录. 首先去官网下载代码,这里一定要注意安装分两种,一种是Source Code源码, ...

  7. ASP.NET Core应用中如何记录和查看日志

    日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日志系统,该系统由Logger.Logger ...

  8. iOS 小知识点(持续更新)

    1.如何通过代码设置Button  title的字体大小 设置Button.titleLabel.font = [UIFont systemFontOfSize:<#(CGFloat)#> ...

  9. Android 微信第三方登录(个人笔记)

    今天在写微信登录,花了半天时间搞定.然后写下自己的笔记,希望帮助更多的人...欢迎各位指教. 微信授权登录,官方说的不是很清楚.所以导致有一部分的坑. 微信注册应用平台的应用签名,下载 微信签名生成工 ...

  10. Python学习实践------正向最大匹配中文分词

    正向最大匹配分词: 1.加载词典文件到集合中,取词典文件中最大长度词的length 2.每次先在句子中按最大长度分割,然后判断分割的词是否存在字典中,存在则记录此词,调整起始点. 3.不存在则按最大长 ...