需求:数据迁移,从远端数据库查询数据写入到生产库中。
遇到问题,数据量为千万级别(具体是6千多万条记录的数据),直接使用insert into 目标表 select * from 数据源表。
因为目标表本身有上千万数据,且有主键和索引,导致写表非常慢。
执行了5,6个小时还没跑完,第二天看索性plsqldev已经卡死了。
只能强行杀掉了plsqldev的进程。
再看看数据,一条都没写进去,有点崩溃。。。
网上查找了高效插入大量数据的方法,原文地址 http://www.cnblogs.com/quanweiru/p/5325635.html
写的很好,很实用。
在测试库测试了下,使用分区表,插入数据到底能快多少。
前提:测试库环境下,表都是没有主键和索引的。
step1, 在测试库新建了一个分区表
create table AC83_P ( aaz219 NUMBER(16) not null, aaz220 NUMBER(16), aaa027 VARCHAR2(12), aac001 NUMBER(20), aaa036 VARCHAR2(6), aaa038 VARCHAR2(3), aaa085 VARCHAR2(1), aaa088 VARCHAR2(1), aae140 VARCHAR2(6), aae002 NUMBER(6), aae003 NUMBER(6), aae019 NUMBER(16,2), bae134 NUMBER(16,2), aae013 VARCHAR2(150), baz057 NUMBER(16), baa018 NUMBER(20) not null, bad709 VARCHAR2(20), bae023 VARCHAR2(9), bad305 VARCHAR2(20) ) partition by hash(aaz219)( partition part01 tablespace data01, partition part02 tablespace data01, partition part03 tablespace data01, partition part04 tablespace data01, partition part05 tablespace data01, partition part06 tablespace data01, partition part07 tablespace data01, partition part08 tablespace data01 );
step2, 将表 ac83 (66,325,831条记录)写入到分区表。
alter table ac83 nologging; insert /*+ append */ into ac83_p select * from ac83;--2分钟 alter table ac83 logging; commit;
结果吓了我一跳,这也 太!快!了! 吧!。2分钟,更准确是116秒完成了整个写入。
顿时有种喜极而泣的感觉。似乎看到了胜利的曙光
ps: +append 只适用于 串行的情况,并行会产生enqueue。
--=========实验结果很好!===========
==>>但问题来了:
1)迁移到目标库, 目标库的表本身有记录,且有主键和索引,都不能删的。
2)目标库的表不是分区表。
==>>新思路:
根据博文提示,可以适用并的方式写入。数据源表 做分区。对每个分区分别insert到目标库。
然而,执行分区写入的时候,报错了
SELECT * FROM AC83_p@dblink_zhdata partition(part01);
ORA-14100: 分区扩展表名不能指远程对象
分析出错原因: 原文地址 http://blog.csdn.net/annicybc/article/details/852561
测试发现虽然通过建立远端对象同义词的方式可以使用PARTITION语句,但是PARTITION语句并没有起任何作用。而且在最后的查询中,指定了一个不存在的分区,但是并没有报错,说明Oracle忽略了PARTITION语句。
说明oracle还是不能通过数据库链进行PARTITION相关的操作,但是如果对同义词采用这种方式的查询,则Oracle没有进行相应的判断,而仅仅是忽略分区语句。
很遗憾,不能通过数据源表 改为分区表,分别insert的办法进行并行写入到目标库。
--============方法2:将分区表按分区拆成几个普通表,并行写入到目标库=======
step1,按分区进行拆分表,新建分表
create table ac83_p1 as SELECT * FROM ac83_p partition(part01); create table ac83_p2 as SELECT * FROM ac83_p partition(part02); create table ac83_p3 as SELECT * FROM ac83_p partition(part03); create table ac83_p4 as SELECT * FROM ac83_p partition(part04); create table ac83_p5 as SELECT * FROM ac83_p partition(part05); create table ac83_p6 as SELECT * FROM ac83_p partition(part06); create table ac83_p7 as SELECT * FROM ac83_p partition(part07); create table ac83_p8 as SELECT * FROM ac83_p partition(part08);
6千多万数据,分配到8张表中,每个表有8百多万记录。
step2, 尝试单独写入一个分表。
alter table ac83 nologging; INSERT /*+ append */ INTO AC83 SELECT * FROM AC83_p1@dblink_zhdata; commit; alter table ac83 logging;
8百多万的数据,看需要多上时间,在写入表有主键和索引的情况下,从远端写入需要多长时间。
13分钟过去了,还没insert完。预估它需要1个小时。静待结果
执行完了, 结果是 1488 s,约24分钟。比预估的还好。
但并行insert同一个表时,不能用/*+ append*/,会产生enqueue。
执行剩下的 7个分表
写入过程中,提示空间不足了。
增加了表空间,写入前为 31G
--insert 前 SELECT a.tablespace_name,sum(bytes)/1024/1024 FROM dba_free_space a WHERE a.tablespace_name in ('GDYLSY_INDEX','GDYLSY_DATA') group by a.tablespace_name; SELECT 34352398336/1024/1024/1024 FROM dual;--31G GDYLSY_INDEX;--2554.56mb GDYLSY_DATA;--32069.56mb--31.31G
测试下 6千万条记录,占用表空间大概多少?
insert 完成查看剩余表空间
GDYLSY_DATA;--26949.56mb--26.31G
GDYLSY_INDEX;--604.125mb
--索引花掉 1950mb --1.9G
--数据记录花掉 5120mb --5G
6千万的数据,占用的空间大致是6-7G。
相关推荐
根据给定文件的信息,“Oracle插入大量数据”的主题围绕着几种有效的策略展开,旨在提升Oracle数据库在大数据量场景下的性能表现。 ### 高速存储设备的应用 首先提及的是采用高速的存储设备来提升读写能力。EMC和...
- 考虑到性能和效率,对于大量数据的插入或更新操作,可以采用批处理方式,一次执行多条记录的操作,减少数据库交互次数,提高整体性能。 总之,向Oracle数据库插入或更新Clob大段文本是一个涉及SQL语句构建、参数...
此方法将大量数据一次性加载到PL/SQL表变量中,然后逐条插入。 七、文件导入 在实际操作中,可能需要从外部文件(如`.sql`文件)导入数据。比如`ts_code_20110316.sql`和`ts_msg_20110316.sql`这样的文件,通常包含...
通过优化这一过程,可以显著提升应用程序的性能,特别是在处理大量数据时。以下是对“java批量插入Oracle数据方法”的深入解析,包括代码示例及其背后的原理。 ### 一、Java批量插入Oracle数据方法概览 在Java中,...
在数据库操作中,批量插入大量数据是常见的性能优化策略,特别是在大数据处理或系统初始化时。批量插入能够显著减少网络通信次数,提升效率,降低数据库事务的开销。本例展示了如何在4秒内高效地插入10万条数据,...
在C#.NET中批量插入大量数据到数据库是一个常见的任务,特别是在处理诸如从Excel文件导入数据等场景时。这里,我们将探讨如何使用C#.NET高效地完成这个任务,并提供一个简单的示例来说明整个过程。 首先,我们需要...
通过巧妙地组合Oracle内置的伪列、函数和递归查询方法,我们可以高效地生成大量结构化的测试数据,这对于优化数据库性能、进行数据建模和测试有着重要的作用。掌握了这一技能,无论是对于日常的数据库管理工作还是...
3. **FORALL**:在收集了大量数据后,可以使用FORALL语句一次性将它们插入到数据库中,避免了循环中的单次插入,提高了性能。 4. **绑定变量**:在Oracle中,绑定变量可以用来提高查询性能,减少解析次数。在批量...
在IT行业中,将Excel数据插入Oracle数据库是一项常见的任务,尤其对于数据分析、报表生成以及数据迁移等场景至关重要。本文将详细讲解如何实现这一过程,并探讨相关的技术细节和优化策略。 首先,我们需要了解Excel...
2. **性能考量**:大量数据的删除可能会严重影响数据库性能,建议在低峰时段执行此类操作。 3. **测试**:在实际环境中删除重复数据前,最好在一个测试环境中先模拟一遍整个流程,以确保不会发生意料之外的问题。 ...
在Oracle数据库中插入图片涉及到BLOB(Binary Large Object)数据类型,这是Oracle用来存储大量二进制数据,如图片、音频或视频文件等的一种方式。本文将详细介绍如何在Oracle数据库中插入、查询和管理图片。 首先...
在处理大量数据时,性能优化显得尤为重要。可以考虑将数据分块读取,或者使用Oracle的批量插入功能。此外,如果Excel文件非常大,还可以考虑先将数据导出为CSV文件,然后通过SQL*Loader等工具快速导入到Oracle数据库...
Oracle大数据量操作性能优化是指在处理大量数据时,如何提高 Oracle 数据库的性能。该优化技术涉及到多个方面,包括分区、Direct Insert、并行和排序处理等。 分区是 Oracle 中的一种优化技术,可以将大型表分割成...
SQL*Loader是Oracle提供的一种快速、高效的数据加载工具,能够从文本文件或者二进制文件中批量导入大量数据到Oracle表中。它允许用户自定义数据格式,并且支持多种数据源,使得数据迁移和备份变得简单。 2. **导入...
当我们需要处理大量数据导入任务时,PLSQL提供了多种方法来实现批量导入,这些方法高效且灵活。本文将详细介绍如何在PLSQL中进行批量导入数据。 一、SQL*Loader SQL*Loader是Oracle提供的一个命令行工具,它能够...
在Oracle数据库中,进行多表关联的批量插入、批量更新和批量删除操作是常见的数据库管理任务,尤其是在处理大量数据时,这些操作能显著提高效率并减少资源消耗。本文将详细探讨这三个方面,并通过实例代码来展示如何...
"OraExcel excel连接oracle插件 批量插入"这个主题聚焦在如何通过OraExcel插件实现Excel与Oracle数据库之间的高效交互,特别是批量数据插入的功能。 OraExcel插件是一款专门设计用于简化Excel与Oracle数据库间数据...
批量同步则是在特定时间点进行一次性的大量数据迁移,比如在业务低峰期。 对于“mysql-oracle数据同步”这个主题,我们可以采用以下几种方法: 1. **使用ETL工具**:Extract, Transform, Load(ETL)工具如...
Oracle OCI(Oracle Call ...总之,Oracle OCI批量插入源代码是利用Oracle数据库接口实现高效数据导入的有效工具,对于处理大量数据的系统尤其重要。通过理解和应用这些代码,开发者可以优化数据库操作,提升系统性能。
1. 高效:该程序可以快速将大量 TXT 文件中的数据导入 Oracle 数据库,提高工作效率。 2. 方便:该程序可以自动将数据导入 Oracle 数据库,免去了手工处理的麻烦。 3. 灵活:该程序可以根据需要修改和扩展,以适应...