`
caiyunlong
  • 浏览: 186930 次
  • 性别: Icon_minigender_1
  • 来自: 海口
社区版块
存档分类
最新评论

上百万行数据insert速度的方法

 
阅读更多
有两个结构相同的表table1,table2
将table1插入到table2中:
 
现在采用两种方法:
1、指定回滚段,回滚段足够大
set transaction use rollback segment RBS1;
      INSERT INTO table1 NOLOGGING
         SELECT * FROM table2;
     commit;
2、采用定义cursor,每5000或10000条记录提交一次
declare
    cursor cur_select is
             select t1,t2,t3..... from tabl1;
v_id number;
v_t  table1%rowtype;
 
begin
    open cur_select;
    
    loop
      exit when cur_select%notfound;
      fetch cur_select into v_t.t1,v_t.t2,v_t.t3..... ;
      
      insert into table2
      (t1,t2,t3......)
      values
      (v_t.t1,v_t.t2,v_t.t3..... );
 
      v_id := v_id + 1;
 
      if v_id = 10000 then
        commit;
        v_id := 0;
      end if;
       
    end loop;
 
    commit; 
end;



再提供一种方法,俺曾经用过的:
alter session set sort_area_size=100000000;
insert into tableb select * from tablea;
commit;

解释(来自网上):
针对每个session,排序首先会使用sort_area_size ,如果不足则会使用临时表空间。
假设sort_area_size = 100k,正好能盛下100条记录进行排序
当排序记录小于等于100条,ok,所有排序在内存中进行,很快
但若超过100条,则会使用临时表空间(利用磁盘进行)
我们选取一个临界值来说明,假设需要排序的记录有10010条
这个时候我们进行的排序会分为101组进行
每读100条进行一次小组排序,然后写入磁盘,第101组只有10条,排序后也写入磁盘
这是进行第二次排序,这次排序将在前100小组里面各抽取一条进行排序。《按照我个人的猜测,应该是排好后每写入一条入磁盘则将该记录所在小组重新抽取一条出来进行排序(这时是有序记录组里面所以很快)》。当这个过程完成后,这时所需要的磁盘空间大约为 实际记录存储空间的2倍(这也是多数书上提到的排序空间大约是记录空间的2倍的原因)
由于还剩下10条记录,于是这10条记录需要跟前面排序的10000条记录进行排序合并,这个代价也是相当大的!
所以,我们通常推荐,假如你需要排序的记录最大为100万条,则sort_area_size最小要能装下1000条,否则如上面的例子,那多余的10条,仅仅10条将会带来巨大的代价!
如果,设置的极度不合理的情况下,排序记录达到了 sort_area_size所能容纳的三次方以上,比如上面例子中排序需要100万记录
那么同样的,重复这个过程,当每一万条记录如上排序后,再如上从这100小组(每组10000条记录)各抽一条进行排序……
在这个过程中,磁盘的消耗和时间的代价大家都应该有个感性认识了
所以,我们建议: sprt_area_size 所能容纳记录数至少大于排序记录数的 平方根
分享到:
评论

相关推荐

    处理百万级以上的数据提高查询速度的方法

    ### 处理百万级以上的数据提高查询速度的方法 在处理大量数据时,如何优化SQL查询以提高查询效率是一项至关重要的技能。以下是从标题、描述、标签以及部分内容中提炼出的关键知识点,这些技巧可以帮助你在面对海量...

    bulk insert导入数据

    - **高效性**:相比传统的 INSERT 语句,`BULK INSERT` 能够显著提高导入速度,特别是在处理大量数据时。 - **批量操作**:一次命令即可完成大批量数据的导入工作。 - **灵活性**:支持多种文件格式(如 CSV、TXT...

    百万级数据在Excel和Sql数据库之间相互导入、导出

    在IT行业中,处理大量...总的来说,正确地在Excel和SQL Server之间导入导出百万级数据需要理解两者的特点,选择合适的方法,并注意数据处理的最佳实践。在实际操作中,应根据具体需求和资源限制来选择最适合的方案。

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

    与传统的单条插入相比,BulkInsert一次性将多条数据提交到数据库,减少了网络往返次数,显著提升了数据导入速度。这对于大数据量的操作尤其有利,可以大大缩短程序运行时间。 4. **自定义配置**: 扩展方法通常还...

    insert插入数据工具

    SELECT`语句,提升数据插入速度。 在实际应用中,"insert插入数据工具"可以广泛应用于数据迁移、数据分析、测试数据准备等多个场景。例如,在系统升级、数据库迁移过程中,可以快速将旧系统的数据导入到新系统中;...

    Sqlserver大数据量插入速度慢或丢失数据的解决方法

    ### Sqlserver大数据量插入速度慢或丢失数据的解决方法 #### 概述 在处理大量数据插入SQL Server数据库的过程中,可能会遇到插入速度慢或者数据丢失的问题。这种情况通常出现在需要批量插入数千甚至上万条记录的...

    MySQL官网测试数据上百万条数据sql文件

    在本资源中,我们有一个名为"MySQL官网测试数据上百万条数据sql文件"的压缩包,它包含了一个或多个SQL脚本,这些脚本设计用于在MySQL数据库中创建并填充大量的测试数据。 SQL(Structured Query Language)是用于...

    mysql优化_提高百万条数据的查询速度

    MySQL 数据库优化是提高百万条数据查询速度的关键技术,尤其对于大数据量的表,优化查询策略至关重要。以下是一些核心的 MySQL 优化建议: 1. **建立索引**:索引能够极大地加速查询过程,特别是在 WHERE 和 ORDER ...

    提高SQL处理查询上百万条数据库的速度

    提高 SQL 处理查询上百万条数据库的速度 在处理大量数据库查询时,SQL 的性能是一个关键问题。以下是 15 条措施,以提高 SQL 处理查询上百万条数据库的速度: 1. 对查询进行优化,尽量避免全表扫描,首先应考虑在 ...

    insert大量数据经验之谈

    这种方法减少了归档日志的生成,加快了插入速度,但不适合在启用强制日志记录(FORCE LOGGING)的Data Guard环境中使用,因为这可能导致数据丢失风险。 2. 并行DML(Parallel DML): ```sql ALTER SESSION ENABLE ...

    SQL Server中导入导出数据三方法比较

    它可以在命令行环境下运行,支持并行操作,从而提高数据装载速度。然而,BCP的使用相对复杂,需要编写格式文件来定义数据布局,并且不提供数据转换或验证功能。因此,当需要简单、快速地处理大量数据且不需要额外的...

    C#实现批量插入sqlserver数据

    这是最基本的方法,通过执行多次`INSERT INTO` SQL语句来插入数据。例如: ```csharp using (SqlCommand cmd = new SqlCommand("INSERT INTO TableName VALUES (@value1, @value2)", conn)) { cmd.Parameters....

    DataTable 快速导入数据库——百万条数据只需几秒

    `DataTable`提供了一系列方法和属性,如`Columns`、`Rows`等,用于创建和管理列以及行数据,使得数据的读取和写入变得简单而高效。 #### `SqlBulkCopy`类解析 `SqlBulkCopy`是SQL Server为.NET Framework提供的一...

    mysql优化提高百万条数据的查询速度[参考].pdf

    MySQL优化提高百万条数据的查询速度 MySQL优化是指在MySQL数据库管理系统中,通过各种优化技术和方法,提高数据库的性能和查询速度。以下是MySQL优化提高百万条数据的查询速度的15个知识点: 1. 对查询进行优化,...

    Mysql构造百万条测试数据

    Mysql 构造百万条测试数据 在实际应用中,许多企业都拥有庞大的数据量,为了提高数据存取的效率,需要对 MySQL 进行优化。以下是使用 MySQL 构造百万条测试数据的步骤和知识点: 1. 生成思路:利用 MySQL 内存表...

    Java多线程优化百万级数据

    在"quick-insert"这个文件中,可能包含的是快速插入数据的示例代码,它可能使用了上述的一些优化策略,如批量插入、线程池、并发容器等,以提高数据读取和处理的速度。通过对这些代码的分析和学习,我们可以更好地...

    nodejs封装好的mysql数据库模块,带mysql连接池以及百万测试数据

    5. **test.sql**:这个文件包含了百万级别的测试数据,可能是通过一系列INSERT语句生成的。这些数据用于模拟大规模数据环境,测试模块在高并发、大数据量情况下的性能和稳定性。在实际项目中,这种规模的数据可以...

    Oracle 大数据量操作性能优化

    Direct Insert 是一种高效的数据插入方式,可以提高数据插入速度。并行是指同时执行多个任务,以提高处理速度。排序处理是指对数据进行排序,以提高查询速度。 Oracle 大数据量操作性能优化技术可以提高 Oracle ...

    对比Oracle数据库中多种导入数据方法

    1. 逐条数据插入 INSERT:这是最基本的数据导入方式,通过编写 SQL 插入语句将数据一行一行地添加到数据库中。这种方式简单易用,但效率较低,适合小规模数据导入。在实验中,导入十万条记录耗时172秒,CPU占用52秒...

Global site tag (gtag.js) - Google Analytics