`
jwin
  • 浏览: 26977 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

海量数据迁移中碰到的分页性能问题

    博客分类:
  • 2008
阅读更多

       最近在做一个近千万级别的数据迁移(从oracle到mysql),由于数据在迁移前后表结构发生很大的变化,比如原来几个用户相关的信息表中若干个字段要转成一个vcard格式的xml存到新表的一个字段中,没办法使用数据库的迁移工具完成,必须通过写代码的方式进行转换迁移。这样就存在一个问题,不可能将旧表的近千万的数据一次性加载到内存中进行转换迁移,必须进行分页。

       一开始,我使用oracle数据库的自己的分页方式(不需要任何排序,只要分页,遍历完所有数据即可),即使用SELECT * FROM(SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM < ?) WHERE RN >= ?进行分页,在主线程中每次取1000条旧库的数据放到队列中,然后多个子线程从队列中消费,进行数据转换及插入到新数据库(mysql)中,主线程判断队列中的数目如果大于某个值,就进行sleep,防止因子线程消费不过来而导致内存溢出。

       测试中发现,开始的一段时间内运行迁移代码的服务器cpu使用率非常高,基本上在100%以上(2个CPU的服务器),看日志也可以看得出主线程生产得够快,子线程忙不过来。可过了一段时间后,运行迁移代码的服务器cpu使用率明显降下来,看日志发现,子线程基本上没事做,而主线程却好像被阻塞了一样,几秒钟才出来一个日志。我意识到分页可能有性能问题了,我把迁移程序停掉,直接拿上边的sql语句到sqlplus执行查找SELECT * FROM(SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM < 1000) WHERE RN >= 0,发现速度非常快,几十毫秒就出来了,可当我再次执行SELECT * FROM(SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM < 1001000) WHERE RN >= 1000000,同样是取1000条记录,时间却差不多要1秒,我还测试了几次,发现分页下标值越大,花费时间越多。这个是无法忍受的。必须要使用另一种分页方式。

     我想到了用表的主键,因为表的主键是整型的,递增惟一,并且有索引。即分页语句变成SELECT * FROM TABLE_NAME WHERE ID >=? AND ID < ?。这回我先在sqlplus执行,发现不管id从多少开始,取1000条记录的时间基本上是一致的,都是在几十毫钞内。于是我修改了迁移代码中主线程分页的方式,后来的迁移也证明我的想法是对的。

     我还测试了一下mysql的分页(limit ?,?)的性能,在同样数量级别的表中,同样取1000条记录,发现它的分页性能比oracle的还要差,当分页下标到百万级别时,要10多秒才出来一个结果。但是如果用主键分页的方式则不存在此问题。

分享到:
评论
3 楼 wangxinpier 2009-10-17  
你好,我也刚我做这部分内容,可以 交流一下吗,我正好有几个问题想请教一下,
我的QQ:303183986
MSN:wang_xin_pier@hotmail.com
现用邮箱:wangxinpier@gmail.com
谢谢
2 楼 jwin 2009-02-02  
yiwujiaoyu 写道

SELECT * FROM TABLE_NAME WHERE ID &gt;=? AND ID &lt; ? 你这是 按照主键来查询的 实际上 有时候,主键并不是连续自增的,这时在分页中,按照id来查,不好判断 到底是查出了多少条

你说的分页指的是查询的分页,需要精确查出当前页的条目数,所以是不能用id的.而我这边的分页是为了不想将整个表的数据一下子全部查出来(数据量太大),而是通过id进行分页的方式,分批查出来.
1 楼 yiwujiaoyu 2009-02-01  
SELECT * FROM TABLE_NAME WHERE ID >=? AND ID < ?
你这是 按照主键来查询的
实际上 有时候,主键并不是连续自增的,这时在分页中,按照id来查,不好判断
到底是查出了多少条

相关推荐

    kettle循环分页迁移数据的完整例子,一次迁移1w数据无压力

    `demo1_gen_pages_variables.ktr`则是为了生成分页所需的变量,确保迁移过程中每次只处理一部分数据,从而避免一次性加载过多数据导致的性能问题。学习和理解这些文件将有助于深入掌握Kettle在大数据环境下的应用...

    藏经阁-向云迁移-海量数据迁移解决方案.pdf

    阿里云存储海量数据迁移解决方案还可以帮助中小企业实现数据迁移,例如将数据从传统的存储系统迁移到云存储平台,实现成本降低、性能提高、数据可靠性提高等目标。 八、总结 阿里云存储海量数据迁移解决方案可以...

    ORACLE DBA工作笔记 运维数据迁移与性能调优

    1. 数据迁移的基本概念和操作流程,如数据导出导入工具的使用(exp/imp或expdp/impdp),在线和离线迁移的策略,以及迁移过程中可能遇到的数据一致性和完整性问题。 2. 性能调优的策略和方法,包括监控数据库性能...

    历史数据迁移的测试,性能测试的

    历史数据迁移测试是软件测试领域中一个特殊且重要的环节,主要涉及将旧系统中的历史数据迁移到新系统或新数据库中,确保数据的准确性和可用性。以下是对这个主题的详细解析: 首先,进行历史数据迁移测试前,需明确...

    数据迁移服务V200R100C00----VMware虚拟机数据迁移方案.doc

    在数据迁移服务V200R100C00中,华为工程师和合作工程师提供了详细的数据迁移方案,包括数据迁移前必读、数据迁移流程、数据迁移前准备等多个方面的内容。 在数据迁移前必读章节中,华为工程师和合作工程师对数据...

    向云迁移海量数据迁移解决方案.pdf

    阿里云高级产品专家吴贻刚在2018云栖大会·深圳峰会中做了题为《向云迁移-海量数据迁移解决方案》的分享,就存储和数据迁移的挑战、阿里云存储海量数据迁移解决方案及客户实践等方面的内容做了深入的分析。

    Oracle数据迁移指南

    在这个过程中,性能优化是至关重要的,因为处理海量数据时,效率直接影响项目的成功与否。 首先,我们要理解数据迁移的基本流程。根据描述,数据迁移主要包括数据的抽取、转换和加载(ETL)过程。在这个过程中,...

    sql 数据迁移工具

    在IT行业中,数据库管理是一项至关重要的任务,而SQL数据迁移工具正是解决这一问题的有效手段。本文将深入探讨SQL数据迁移工具的功能、应用场景以及常见的迁移策略。 SQL数据迁移工具,如标题所示,是一种能够帮助...

    Redis集群数据迁移操作文档

    在IT领域,数据迁移是一项关键任务,特别是在使用Redis这样的高性能内存数据库时。本文将详细介绍如何进行Redis集群的数据迁移,包括全量和增量数据迁移,以及离线迁移的方法,主要工具是RedisShake。 RedisShake是...

    Oracle的DataGuard技术在医院整体数据迁移中的应用.pdf

    Oracle 数据库在医院数据迁移中的 DataGuard 技术应用 Oracle 的 DataGuard 技术在医院整体数据迁移中的应用是指在医院业务量迅速增加和新院区数据中心硬件设施的建成的情况下,使用 Oracle 数据库管理系统的 ...

    kettle oracle循环分页迁移数据的完整例子,生成txt后FTP上传到远程服务器

    3. **循环分页查询**:在大数据量的场景下,一次性获取所有数据可能会导致性能问题,因此通常采用分页查询的方式来处理。Kettle中的“生成分页.ktr”可能就是实现这个功能的工作流,通过设置页码和每页大小来逐次...

    Mycat2数据迁移工具-yugong免积分下载!

    通过路由策略,Mycat可以智能地将SQL请求分配到不同的数据节点,有效解决了单机数据库性能瓶颈的问题,同时提供了高可用性和读写分离等特性。 Yugong数据迁移工具则专注于解决从MySQL到Mycat的数据迁移问题。它具备...

    数据迁移 说明 oracle 数据迁移完整手册

    Oracle 数据迁移完整手册 Oracle 数据迁移是一种常见的数据库管理操作,目的是将 Oracle 数据库从一台服务器迁移到另一台服务器。以下是 Oracle 数据迁移的完整手册,涵盖了迁移方法概述、实现步骤、其他方法等...

    oracle数据迁移工具

    5. **安全性与性能**:迁移工具应考虑数据安全,如使用加密传输数据,同时优化迁移性能,减少对源和目标数据库的影响,例如通过批量操作来提高迁移速度。 6. **导库工具**:这个文件可能是数据迁移工具的一部分,...

    NC升级数据迁移工具手册

    - 迁移前需对数据进行备份,以防万一出现问题时能够快速恢复。 #### 五、迁移场景 - **全量迁移**: 将旧系统中的所有数据完整迁移到新系统。 - **增量迁移**: 在全量迁移的基础上,只迁移新增或修改的数据。 - **按...

Global site tag (gtag.js) - Google Analytics