在Oracle中如何对超大规模数据(例如超过2亿条)进行insert 入库

在Oracle中如何对超大规模数据(如超过2亿条)
进行insert 入库?
在实际生产环境下,有时需将超大规模数据(如超过2亿条)导入分区表,但因原表与目的分区表的字段不一致,且用Kettle等转换工具极易失败,而用insert into select t1,t2.. from tab的Oracle SQL方式直接执行将导致redo、undo 日志暴增,使数据库容易假死。

针对此问题,采用以下方法可完美解决,且对系统性能几乎无影响(不管是分区表还是普通堆表都可行)。

1、将目标表(如tab)的索引及约束去掉,待insert完成后再建索引及约束;
2、将目标表的日志记录关掉,待插入完成后再打开:
3、使用Copy 方法进行导入:
--设置数组大小为5000
--设置提交次数为10次,即每产生5万条数据才提交一次
--使用copy 语句来执行
--特别注意:insert into 在copy from 中无"into"语法,每个字段名称均应与目标表字段名称一致,每行后需有“-”
4、执行结果如下:
经实际测试,约2亿条数据插入至新表中,耗时约1小时50分,产生日志量较少,且对系统性能几乎无影响。

合集下载

oracle insert 写法

oracle insert 写法

oracle insert 写法Oracle Insert 写法指的是在Oracle数据库中向表格中插入数据时所采用的语法。

在数据库的日常维护中,插入数据是非常常见而又必不可少的操作。

因此,了解Oracle Insert 写法不仅可以提高工作效率,还能有效地避免出现错误。

以下是Oracle Insert 写法的详细分步解析:第一步:语法规则在Oracle数据库中,可以使用INSERT INTO语句来向表格中插入数据。

语法如下:INSERT INTO 表格名(列1, 列2,...) VALUES (值1, 值2,...);在该语句中,“表格名”是指要插入数据的表格名称,“列1, 列2,...”是指要插入的列名称,“值1, 值2,...”是指要插入的具体值。

需要注意的是,列和对应的值必须一一对应。

另外,如果要插入多条数据,可以使用INSERT ALL语句。

语法如下:INSERT ALL INTO 表格名(列1, 列2,...) VALUES (值1, 值2,...) INTO 表格名(列1, 列2,...) VALUES (值1, 值2,...) SELECT * FROM dual;在该语句中,“INTO 表格名(列1, 列2,...) VALUES (值1, 值2,...)”是指需要插入的表格名、列名以及具体值。

多条插入语句使用SELECT * FROM dual连接。

第二步:常用写法常规的Oracle Insert 写法如下:INSERT INTO 表格名(列1, 列2,...) VALUES (值1, 值2,...);例如:INSERT INTO employee(name, age, salary) VALUES('Tom', 18, 2000);以上写法的含义是在employee表格中,向name、age、salary三列中分别插入'Tom'、18和2000这三个值。

oracle的insert用法

oracle的insert用法

oracle的insert用法一、引言Oracle数据库是一种广泛应用于企业级应用系统的关系型数据库管理系统。

Insert操作是Oracle数据库中常用的数据插入方法,用于向数据库表中插入新的数据记录。

本篇文档将详细介绍Oracle数据库中Insert用法的基本概念、语法、注意事项以及应用场景。

二、基本概念Insert操作用于向表中插入新的数据记录,它需要指定要插入数据的表名和要插入的数据。

Insert操作通常与SELECT语句结合使用,从其他表或查询结果中获取要插入的数据。

三、语法Oracle数据库的Insert用法的基本语法如下:INSERT INTO table_name (column1, column2, column3, ...)VALUES (value1, value2, value3, ...);其中,table_name是要插入数据的表名,column1, column2, column3等是要插入数据的列名,value1, value2, value3等是要插入的具体值。

如果要插入的数据来自于其他表或查询结果,可以使用SELECT语句。

四、注意事项在使用Insert操作时,需要注意以下几点:1. 确保插入的数据符合表的结构和约束条件;2. 插入的数据类型必须与列的数据类型匹配;3. 插入的数据值必须符合数据库的合法性要求;4. 插入的数据量不能超过表的行数限制;5. 插入的数据不能违反表的唯一性约束(如主键约束、唯一索引等)。

五、应用场景Insert用法在Oracle数据库中应用广泛,以下是一些常见的应用场景:1. 批量数据插入:当需要将大量数据插入到表中时,可以使用INSERT语句逐条插入,也可以使用INSERT ALL语句进行批量插入;2. 临时表数据插入:临时表是一种特殊类型的表,其数据在会话结束时自动删除。

可以使用INSERT INTO语句向临时表中插入数据;3. 从其他表或查询结果中插入数据:当需要从其他表或查询结果中获取数据并插入到目标表中时,可以使用INSERT INTO...VALUES语句;4. 数据更新:在某些情况下,可能需要将一条已存在的记录更新为新的数据,这时可以使用UPDATE语句配合WHERE子句和VALUES子句来实现。

oracle的insert语句

oracle的insert语句

oracle的insert语句Oracle是一种关系型数据库管理系统,它支持SQL语言,可以使用INSERT语句将数据插入到表中。

INSERT语句是SQL语言中最常用的语句之一,它用于将数据插入到表中。

在本文中,我们将介绍Oracle中的INSERT语句,并提供一些示例。

1. 插入单行数据INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);这是最基本的INSERT语句,它用于将一行数据插入到表中。

在这个语句中,我们需要指定表名和列名,然后提供要插入的值。

例如,我们有一个名为“employees”的表,它有三个列:id、name和age。

我们可以使用以下语句将一行数据插入到表中:INSERT INTO employees (id, name, age) VALUES (1, 'John', 30);这将在“employees”表中插入一行数据,其中id为1,name为“John”,age为30。

2. 插入多行数据INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...), (value1, value2,value3, ...), ...;如果我们需要将多行数据插入到表中,我们可以使用INSERT语句的扩展语法。

在这个语法中,我们可以在一个INSERT语句中插入多个值。

例如,我们有一个名为“employees”的表,它有三个列:id、name和age。

我们可以使用以下语句将多行数据插入到表中:INSERT INTO employees (id, name, age) VALUES (1, 'John', 30), (2, 'Mary', 25), (3, 'Tom', 35);这将在“employees”表中插入三行数据,分别为id为1、name 为“John”、age为30;id为2、name为“Mary”、age为25;id为3、name为“Tom”、age为35。

Oracle数据的批量插入

Oracle数据的批量插入

Oracle数据的批量插入前两天接到一个需求——需要编程将SQL Server中的数据插入至Oracle 数据大约有多万条记录开始的时候我采取了直接构建SQL插入的方式结果耗时太长为了提高性能我上网找了资料最终采用DataAdapter批量插入至Oracle 提高了性能代码如下一直接构建SQL语句插入VB NETsw Start()Read Z J from SQL ServerDim sqlCmd As New SqlCommand()sqlCmd Connection = sqlConnectionsqlCmd CommandText = SELECT * FROM Z JDim sqlDr As SqlDataReadersqlDr = sqlCmd ExecuteReader()Dim cmdInsertZ J As New OracleCommand()cmdInsertZ J Connection = oraConnectioncmdInsertZ J CommandText = BuildSQLStatement(SQLType Insert z j )Dim plantLever material oldMaterialNum materialDescription As ObjectWhile sqlDr Read()plantLever = ReadSqlDataReader(sqlDr )material = ReadSqlDataReader(sqlDr )oldMaterialNum = ReadSqlDataReader(sqlDr )materialDescription = ReadSqlDataReader(sqlDr )Insert to Oracle table Z JcmdInsertZ J Parameters AddWithValue( :plantLever plantLever)cmdInsertZ J Parameters AddWithValue( :material material) cmdInsertZ J Parameters AddWithValue( :oldMaterialNum oldMaterialNum)cmdInsertZ J Parameters AddWithValue( :materialDescription materialDescription) cmdInsertZ J ExecuteNonQuery()End Whilesw Stop()Loger Info( Reading z j form sql sever used sw Elapsed TotalSeconds T oString())二采用DataAdapter实现批量插入VB NETsw Start()Read Z J from SQL ServerDim sqlCmd As New SqlCommand()sqlCmd Connection = sqlConnectionsqlCmd CommandText = SELECT * FROM Z JDim sqlDr As SqlDataReadersqlDr = sqlCmd ExecuteReader()Dim cmdInsertZ J As New OracleCommand()cmdInsertZ J Connection = oraConnectioncmdInsertZ J CommandText = BuildSQLStatement(SQLTypeInsert z j )Dim dtSqlZ J As New DataTabledtSqlZ J Columns Add( plantLever )dtSqlZ J Columns Add( material )dtSqlZ J Columns Add( oldMaterialNum )dtSqlZ J Columns Add( materialDescription )Dim plantLever material oldMaterialNum materialDescription As ObjectWhile sqlDr Read()plantLever = ReadSqlDataReader(sqlDr )material = ReadSqlDataReader(sqlDr )oldMaterialNum = ReadSqlDataReader(sqlDr )materialDescription = ReadSqlDataReader(sqlDr )dtSqlZ J Rows Add(plantLever material oldMaterialNum materialDescription)End Whilesw Stop()Loger Info( Reading z j form sql sever used sw Elapsed TotalSeconds T oString())sw Start()Dim oraDa As New OracleDataAdapter()oraDa InsertCommand = cmdInsertZ JoraDa InsertCommand Parameters Add( :plantLever OracleType Char plantLever )oraDa InsertCommand Parameters Add( :material OracleType Char material )oraDa InsertCommand Parameters Add( :oldMaterialNumOracleType Char oldMaterialNum )oraDa InsertCommand Parameters Add( :materialDescription OracleType Char materialDescription )oraDa InsertCommand UpdatedRowSource = UpdateRowSource NoneoraDa UpdateBatchSize = Adjust the batch size based on testing resultoraDa Update(dtSqlZ J)sw Stop()lishixinzhi/Article/program/Oracle/201311/18480。

oracle中的insert语句

oracle中的insert语句

VALUES <record_name>; CREATE TABLE t AS SELECT table_name, tablespace_name FROM all_tables;
SELECT COUNT(*) FROM t;
DECLARE trec t%ROWTYPE; BEGIN
trec.table_name := 'NEW'; trec.tablespace_name := 'NEW_TBSP';
CREATE TABLE emp_10 AS SELECT * FROM emp WHERE 1=0; CREATE TABLE emp_20 AS SELECT * FROM emp WHERE 1=0; CREATE TABLE emp_30 AS SELECT * FROM emp WHERE 1=0; CREATE TABLE leftover AS SELECT * FROM emp WHERE 1=0;
INSERT INTO A (列1,列2,列3)
SELECT 列1,列2,列3
FROM B ;
--查询语句中可以使用任意复杂的条件或者子查询
如果数据的来源不是现存表的数据,ERT INTO tablename(列1,列2,列3,)
SELECT 值1,值2,值3 FROM DUAL
Demo Data INSERT INTO emp VALUES (7369, 'SMITH', 'CLERK', 7902, 800, 20); INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, 1600, 30); INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN', 7698, 1250, 30); INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER', 7839, 2975, 20); INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698, 1250, 30); INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839, 2850, 30); INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839, 2450, 10); INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566, 3000, 20); INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL, 5000, 10); INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698, 1500, 30); INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788, 1100, 20); INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698, 950, 30); INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566, 3000, 60); INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782, 1300, 10); COMMIT;

快速向表中插入大量数据Oracle中append与Nologging

快速向表中插入大量数据Oracle中append与Nologging

快速向表中插⼊⼤量数据Oracle中append与Nologging当需要对⼀个⾮常⼤的表INSERT的时候,会消耗⾮常多的资源,因为update表的时候,oracle需要⽣成 redo log和undo log;此时最好的解决办法是⽤insert, 并且将表设置为nologging;当把表设为nologging后,并且使⽤的insert时,速度是最快的,这个时候oracle只会⽣成最低限度的必须的redo log,⽽没有⼀点undo信息。

如果有可能将index也删除,重建1.alter table table_name nologging;2. insert into table_name select * from xxxx;对此有了更好的解决⽅法:1、alter table nologging;注释:Nologging的设置跟数据库的运⾏模式有关a、查询当前数据库的归档状态:select name,log_mode from v$database;默认为 NOARCHIVELOG ⾮归档b、nologging在归档模式下有效,⾮归档模式nologging不起什么作⽤c、为了提⾼插⼊的速度,我们可以对表关闭写log功能。

SQL 如下:sql> alter table table_name NOLOGGING;插⼊/修改,完数据后,再修改表写⽇志:sql> alter table table_name LOGGING;d、没有写log,速度会块很多,但是也增加了风险,如果出现问题就不能恢复。

2、drop掉索引约束之类的;注释:3、注释:a. 、append 属于direct insert,归档模式下append+table nologging会⼤量减少⽇志,⾮归档模式append会⼤量减少⽇志,append⽅式插⼊只会产⽣很少的undob、综合⼀下吧:⼀是减少对空间的搜索;⼆是有可能减少redolog的产⽣。

oracle大库导入注意事项

oracle大库导入注意事项导入大型Oracle数据库需要仔细考虑和规划,以确保数据的安全性和完整性。

以下是一些导入大型Oracle数据库时需要注意的事项:1.规划和准备阶段:2.数据备份和恢复:在导入数据之前,务必先进行数据库备份。

这样,如果在导入过程中出现错误或数据丢失,可以恢复到原始状态。

备份数据库可以使用数据库管理工具或使用数据库自带的备份功能。

3.导入方法选择:在导入大型Oracle数据库时,可以使用多种方法。

一种常见的方法是使用Oracle Data Pump实用程序。

该实用程序可以高效地导入和导出大量数据。

另一种方法是使用SQL 某Loader实用程序,它可以从文本文件中加载数据。

根据实际情况选择合适的导入方法。

4.分批导入:对于非常大的数据库,可以考虑将数据分批导入。

这样可以减少导入时间,降低系统资源的负载。

可以根据表的大小、数据的相关性等因素来划分导入批次。

确保在每个批次之间做好数据一致性和完整性的检查。

5.数据验证:在导入数据之后,务必进行数据验证。

验证可以通过检查导入的数据是否正确、完整和与源数据一致来实现。

可以使用SQL查询或数据库管理工具来验证数据。

对于特别重要的数据,可以考虑使用脚本或程序来自动验证数据。

6.错误处理:在导入大型Oracle数据库时,可能会出现各种错误。

为了确保数据的完整性,需要及时处理这些错误。

可以使用Oracle提供的错误处理工具和功能,如错误日志和错误重定向。

在处理错误时,需要详细记录和审查错误报告,并采取适当的纠正措施。

7.性能优化:导入大型Oracle数据库可能会对系统性能造成一定的影响。

为了尽可能提高导入速度,可以采取一些性能优化措施。

例如,可以临时禁用索引、禁用触发器、使用并行导入等。

同时,还需要对数据库进行适当的配置和调优,以优化导入过程中的资源利用和数据库性能。

总之,导入大型Oracle数据库需要仔细的规划、备份和恢复策略,选择合适的导入方法,分批导入数据并进行数据验证和错误处理。

oracle的insertinto用法

oracle的insertinto用法在Oracle数据库中,INSERT INTO语句用于向表中插入新行数据。

它的一般语法如下:INSERT INTO table_name (column1, column2, column3, ...)VALUES (value1, value2, value3, ...);其中:- table_name是要插入的表的名称。

- column1,column2,column3等是要插入数据的列的名称。

- value1,value2,value3等是要插入的具体值。

INSERTINTO语句有以下一些重要的用法和注意事项:1.插入行的列和值的数量必须匹配,即每个列名必须对应一个值。

2.如果要插入全部列的值,可以省略列名。

例如:INSERT INTO table_nameVALUES (value1, value2, value3, ...);3.如果表的一些列设置了默认值,可以不必插入这些列的值,数据库会自动使用默认值。

4.插入的数据类型必须与表中相应列的数据类型兼容,否则会出现类型转换错误。

5.如果要插入的表中的一些列设有唯一约束,则插入违反唯一约束的行时将抛出错误。

6.可以一次插入多行数据,即在VALUES子句中为每一行指定相应的值。

INSERT INTO table_name (column1, column2, column3, ...)VALUES(value1, value2, value3, ...),(value4, value5, value6, ...),...;这样的语法可以大大提高插入多行数据时的效率。

7.INSERTINTO语句的结果是插入的行数,可以使用返回值来判断是否成功插入了数据。

8. 在Oracle中,还有其他一些INSERT INTO的扩展用法,例如使用子查询、使用序列等。

下面将进行详细介绍。

使用子查询:可以在INSERTINTO语句中使用子查询,将子查询的结果插入目标表。

使用Oracle的存储过程批量插入数据

使⽤Oracle的存储过程批量插⼊数据原⽂地址:作者:最近在⼯作中,需要使⽤⽣成⼀些测试数据⽤来测试项⽬性能,我⼀开始是通过使⽤python⽣成SQL再执⾏,但性能不理想,今天想试试使⽤oracle的存储过程来实现下,效果还不错。

实现相关表结构desc TMP_UPSTATE_CASEKEYName Null Type------------------- -------- ----------TMP_UPSTATE_CASEKEY NOT NULL CHAR(14)TMP_NUM_STATUS_ID NOT NULL NUMBER(38)UPDATED_DATE NOT NULL DATE需要⽣成的SQLinsert into TMP_UPSTATE_CASEKEY values('TMP0000001', 1, sysdate);存储过程实现create or replace procedure proc_casekey_upstateascasekey char(14);beginfor i in 1..10000000 loopcasekey := 'TMP'||lpad(i,7,0); -- TMP0000001insert into TMP_UPSTATE_CASEKEY values(casekey, 1, sysdate);end loop;commit;end;beginproc_casekey_upstate();end;测试发现⽣成⼀千万条数据⽤了14分钟左右,性能还是可以了,如果先去掉TMP_NUM_STATUS_ID的外键估计更快。

⽹友雷厉*风⾏指出下⾯的⽅式速度更快,我测试插⼊⼀百万条记录⼗秒左右,当然了,这跟机器性能也有关系。

insert into TMP_UPSTATE_CASEKEY select 'TMP'||LPAD(rownum,7,0),1,sysdate from dual connect by level <= 1000000;使⽤python⽣成SQL⽂件下⾯贴出使⽤python3⽣成SQL的代码from datetime import datetimestart = datetime.now();with open('d:/casekey_upstate.sql', 'w') as f:for x in range(1, 10000000):print("insert into tmp_upstate_casekey values('TMP%07i', 1, sysdate);" %x, file=f);end = datetime.now();print(end-start);⽣成的sql⽂件达638M, 耗时31秒,有⽊有感觉使⽤python很⽅便呢。

insert oracle用法

insert oracle用法Oracle是目前世界上最流行的关系型数据库管理系统之一。

它提供了强大的功能和灵活的操作方式,能够满足各种规模和类型的企业需求。

其中,insert语句是在Oracle中用来插入数据的关键命令之一。

本文将详细介绍insert语句的使用方法和注意事项。

一、INSERT语句的基本语法在Oracle中,INSERT语句用于向表中插入新的记录。

其基本语法如下所示:INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);其中,table_name是要插入数据的表名,column1、column2等是要插入数据的列名,value1、value2等是要插入数据的值。

二、插入单行数据要插入单行数据,可以使用INSERT INTO语句。

例如,要在名为“employees”的表中插入一条记录,可以使用以下语句:INSERT INTO employees (employee_id, first_name, last_name, hire_date) VALUES (1, 'John', 'Doe', '2022-01-01');这条语句将在名为“employees”的表中插入一条记录,其中包括员工编号、员工名字、员工姓氏和入职日期等字段信息。

三、插入多行数据要插入多行数据,可以使用INSERT语句的多个VALUES子句。

例如,要在名为“employees”的表中插入多条记录,可以使用以下语句:INSERT INTO employees (employee_id, first_name, last_name, hire_date) VALUES (1, 'John', 'Doe', '2022-01-01'), (2, 'Jane', 'Smith', '2022-02-01'), (3, 'Mike','Johnson', '2022-03-01');这条语句将在名为“employees”的表中插入三条记录,每条记录包括员工编号、员工名字、员工姓氏和入职日期等字段信息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档