`
mikixiyou
  • 浏览: 1100536 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353633
社区版块
存档分类
最新评论

使用bulk insert快速插入大批量数据

阅读更多

Oracle 数据库中,需要插入大数据量到表中时,如一次性数据量为百万级别。通常想到的是加nologging append 等提示,提升插入数据的速度。

但还有一种方法,是从根本上改变记录的插入方式。它就是bulk insert

我们简单比较一下此方法和普通的插入方法的差别,主要是性能上的。在数据块层面的操作,以后再分析。

(墙内链接: http://mikixiyou.iteye.com/blog/1532688 )

首先,创建一张普通的表t1(CREATE TABLE t1 AS SELECT * FROM dba_objects )

写一个存储过程,用于模拟普通的数据插入方法。

create or replace procedure test_proc is

begin

  for x in (select * from dba_objects) loop

    insert into t1

      (owner,

       object_name,

       subobject_name,

       object_id,

       data_object_id,

       object_type,

       created,

       last_ddl_time,

       timestamp,

       status,

       temporary,

       generated,

       secondary)

    values

      (x.owner,

       x.object_name,

       x.subobject_name,

       x.object_id,

       x.data_object_id,

       x.object_type,

       x.created,

       x.last_ddl_time,

       x.timestamp,

       x.status,

       x.temporary,

       x.generated,

       x.secondary);

  end loop;

  commit;

end test_proc;

/
 

 

模拟bulk insert 插入方法

create or replace procedure test_proc2(p_array_size in pls_integer default 100) is

  type array is table of dba_objects%rowtype;

  l_data array;

  cursor c is

    select * from dba_objects;

begin

  open c;

  loop

    fetch c bulk collect

      into l_data limit p_array_size; 

    forall i in 1 .. l_data.count

      insert into t1 values l_data (i); 

    exit when c%notfound;

  end loop;

  close c;

  commit;

end test_proc2;

/
 

在这个方法中,每100 条作为一个批次。

下面开始测试,过程如下:

普通方法执行一次,一致性读的数目为23947

 

SQL> select b.name,a.* from v$mystat a,v$statname b where a.STATISTIC#=b.STATISTIC# and b.name in ('consistent gets','physical reads')

  2  ;

 

NAME                                                                    SID STATISTIC#      VALUE

---------------------------------------------------------------- ---------- ---------- ----------

consistent gets                                                         395         50         23

physical reads                                                          395         54          0

 

SQL> execute test_proc;

 

PL/SQL procedure successfully completed

 

SQL> select b.name,a.* from v$mystat a,v$statname b where a.STATISTIC#=b.STATISTIC# and b.name in ('consistent gets','physical reads');

 

NAME                                                                    SID STATISTIC#      VALUE

---------------------------------------------------------------- ---------- ---------- ----------

consistent gets                                                         395         50      23970

physical reads                                                          395         54          0

 

SQL>

 

 

bulk insert 致性一次,一致性读的数目为6710

 

SQL> select b.name,a.* from v$mystat a,v$statname b where a.STATISTIC#=b.STATISTIC# and b.name in ('consistent gets','physical reads');

 

NAME                                                                    SID STATISTIC#      VALUE

---------------------------------------------------------------- ---------- ---------- ----------

consistent gets                                                         420         50         19

physical reads                                                          420         54          0

 

SQL> execute test_proc2;

 

PL/SQL procedure successfully completed

 

SQL> select b.name,a.* from v$mystat a,v$statname b where a.STATISTIC#=b.STATISTIC# and b.name in ('consistent gets','physical reads');

 

NAME                                                                    SID STATISTIC#      VALUE

---------------------------------------------------------------- ---------- ---------- ----------

consistent gets                                                         420         50       6729

physical reads                                                          420         54          0

 

 

根据实验结果,可以证实内存读的差别还是蛮大的。

因此,在大数据量插入操作时,可以采用bulk insert 方法。

0
1
分享到:
评论

相关推荐

    EF扩展方法BulkInsert(批量添加)

    - 在使用BulkInsert前,确保所有实体都已正确设置主键,否则可能导致数据冲突或插入失败。 6. **适用场景**: BulkInsert最适合于一次性插入大量数据的情况,比如初始化数据库、数据迁移或批量导入导出。对于实时...

    mysql大批量数据插入

    MySQL 提供了多种方法来实现大批量数据插入,包括使用批量插入语句、使用 LOAD DATA 语句、使用 MySQL 的 Bulk Insert 机制等。 在 MySQL 中,使用批量插入语句可以大大提高数据插入的速度。批量插入语句的格式如下...

    使用BULK INSERT大批量导入数据 SQLSERVER

    ### 使用BULK INSERT大批量导入数据到SQL Server 在数据库管理与开发中,高效地导入大量数据是一项重要的技能。SQL Server 提供了多种方法来处理此类需求,其中`BULK INSERT`命令因其简单且高效的特性而被广泛使用...

    Bulk Insert 批量操作数据库类

    这个类提供了快速且高效的批量插入功能,大大提升了数据迁移的效率,尤其对于大数据量的操作而言。在本篇文章中,我们将深入探讨`SqlBulkCopy`类的使用方法及其核心特性。 `SqlBulkCopy`是.NET Framework的System....

    C#.NET中如何批量插入大量数据到数据库中

    2. **批量插入(Bulk Insert)**:SQL Server 提供了一个`SqlBulkCopy`类,用于快速地将大量数据从一个数据源(如DataTable或DataReader)复制到SQL Server表中。这比逐行插入要快得多。 ```csharp using ...

    plsql批量导入数据

    批量插入可以使用INSERT ALL语句,一次写入多行数据,如: ```sql INSERT ALL INTO table1 VALUES (value1, value2) INTO table2 VALUES (value3, value4) SELECT * FROM dual; ``` 三、BULK COLLECT 和 FORALL ...

    大量数据插入 sql语句

    - **BULK 插入**:特别适合于大批量数据的快速插入,能够显著提高插入效率。 综上所述,在实际应用中根据数据量大小选择合适的插入策略是非常重要的。对于大数据量的场景,推荐使用 `BULK` 插入机制来提高数据处理...

    insert大量数据经验之谈

    本文主要分享了在非生产环境中快速、大批量插入数据的一些经验技巧,这些技巧主要适用于Oracle数据库系统。 首先,基础的`INSERT INTO ... SELECT FROM`语句是最常见的数据迁移方式。例如: ```sql INSERT INTO tab...

    clickhouse-bulk:将许多小插入物收集到ClickHouse并发送大插入物

    简单的插入收集器。 它收集请求并将其发送到ClickHouse服务器。 安装 为您 或者 或从来源(转到1.13及更高版本): git clone https://github.com/nikepan/clickhouse-bulk cd clickhouse-bulk go build 特征 将n...

    提高mysql插入数据的速度.pdf

    增大这个值可以提高大批量数据插入时的性能。 - `innodb_buffer_pool_size`:这个参数是InnoDB存储引擎的关键配置项,它决定了InnoDB如何缓存数据和索引。适当增加此参数可以减少磁盘I/O操作,提高插入效率。 - `...

    批量插入数据到Oracle数据库Demo

    例如,我们可以从CSV文件中读取数据,然后使用BULK COLLECT INTO将这些数据批量插入到表中。 3. **FORALL**:在收集了大量数据后,可以使用FORALL语句一次性将它们插入到数据库中,避免了循环中的单次插入,提高了...

    向数据库中导入数据的几种方法

    这种方式通常比使用INSERT语句快很多,适用于大批量数据导入。例如,`LOAD DATA INFILE 'data.txt' INTO TABLE my_table;` 4. **COPY命令(PostgreSQL)**: PostgreSQL的COPY命令允许从文件系统直接导入或导出...

    将海量数据导入到sql中

    BULK INSERT是SQL Server中用于大批量数据导入的另一种强大工具,其语法简洁,执行效率高。与BCP相比,BULK INSERT更适用于需要在应用程序中动态执行数据导入的情况,因为它是SQL Server内部的一个语句,可以直接在T...

    C#处理大容量数据,及多线程简单应用

    例如,使用`SELECT INTO`语句进行数据导入,或者利用`BULK INSERT`命令快速批量导入大量数据。在导出数据时,可以使用`WITH (NOLOCK)`读锁定提示来减少锁竞争,提高并发性能。此外,索引的合理使用也能大幅提升查询...

    SqlBulkCopy批量数据插入

    总之,`SqlBulkCopy`是C#中进行大批量数据插入的利器,能够显著提升数据库操作的效率,尤其是在处理大量数据时。正确理解和使用`SqlBulkCopy`,可以帮助开发者更有效地实现数据迁移和管理,提升应用的性能和用户体验...

    PHP大批量插入数据库的3种方法和速度对比

    总结来说,对于大批量数据插入,逐条插入的方式最不推荐,因为它会导致大量的数据库交互和时间浪费。事务提交是更实用的方法,适用于大多数情况,可以平衡性能和资源消耗。而批量插入则在速度上具有显著优势,但在...

    高性能数据访问操作示例+Z.Dapper.Plus+免费

    connection.BulkInsert(people); ``` 这将一次性插入所有人员,比逐个插入更高效。 4. **查询**:虽然Dapper已经支持简单的查询,但Z.Dapper.Plus提供了更方便的查询方法,如: ```csharp var result = ...

Global site tag (gtag.js) - Google Analytics