oracle 分页sql语句的深入理解
从oracle数据里向外迁移大量数据,有多种方法。其中一种就是应用jdbc连接oracle,写代码向外分页提取。我现在工作的一个任务就是从oracle中单表数据提取出来,进行单行数据加工转换,然后再写入mysql中。我所用的工具是spring batch。原来的方案是通过生成sql语句,直接导入mysql中,但是这个数据转换业务太复杂,所以就采用了前面的方案。 spring batch 对于数据进行批处理,主要分三步:
本文不讲如何应用spring batch 的具体步骤,只讲如何在oracle中如何进行分页提取。从oracle中读取数据,如果数据量不大,我们可以一次性直接取出,然后根据业务规则处理后续步骤。但是当数据量大到一定程度,就不能一次取出那么多数据,不然后果自负。那么如何进行分而获取呢? select * from ( select rownum rownum_,t1.* FROM (我的查询语句) t1 ) t2 where t2.rownum_>? and t2.rownum_ <=?
一直也没有太在意它的好与坏。但是这次导数据,被始的时候从oracle中提取数据很快,可是越到后面提取的时间越长。这让我不得其解,所以就怀疑这个sql的性能。后来将其改为(方案B): select * from ( select rownum rownum_,t1.* FROM ( 我的查询语句 ) t1 where rownum<=? ) t2 where t2.rownum_>?
速度就上去,方案B的性能好与方案A,所以大家不要用方案A,要采用方案B。 小插曲: 背景:关于这本书是没得买了,我不太爱看电子书,大约2年前就把第8章、第9章打印出来了,看了之后也没有装订,就散放在书架上的。 现在:我也是偶然间看到这个解决方案的,之前因为程序出现性能问题,很郁闷的下班回家,路上一起在思考这个问题,如何才能解决它的性能呢?可是回到家吃过了晚饭,关于这个问题也没有找到答案。家里有一个2岁的熊孩子,只要见到笔,那就要纸(之前我跟我妈说了,纸给他玩没事,书就别给他涂了),然后他的作品就这样产生了,纸散落的到处都是。吃过饭了,帮他收拾烂摊子的时候,偶然捡到这张A4纸正好是关于ROWNUM的,于是就细细的再读读这一段,第二天改了代码一切都ok了。所以家里有个熊孩子或萌娃子也不错,他会把你所有的所有的东西都会帮你找出来晒晒,哈哈!谢谢熊孩子! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |