精华内容
下载资源
问答
  • oracle海量数据插入探究: –转载:https://mp.weixin.qq.com/s/d3XegSgatBSg88hhnYC5Lg 以下用一个实例证明研发对于数据库性能的巨大影响。 –使用交叉连接构造百万计表: –创建同结构空表 我们的目标是将ext_...

    oracle海量数据插入探究:
    –转载:https://mp.weixin.qq.com/s/d3XegSgatBSg88hhnYC5Lg
    以下用一个实例证明研发对于数据库性能的巨大影响。

    –使用交叉连接构造百万计表:
    在这里插入图片描述
    –创建同结构空表
    在这里插入图片描述我们的目标是将ext_scan_objects的数据插入到另外一张空表中去。

    第一种方法:常规插入

    为了验证时间消耗,我们打开时间显示在这里插入图片描述
    优点1:语法简单

    优点2:对于小表、中表(数据量在千万级别左右或以下)较为合适,时间也快(本次约为83秒)

    缺点1:数据量大的话,耗时长并且完成时间无法估测

    致命缺点:如果数据量大到一定规模,大概率出现无法完成的情况,同时由于是一个事务一旦中途出现问题,会出现大事务长时间回滚,严重影响性能,并且重新开始,需要重新插入第一条数据

    第二种方法:row by row +每行commit
    在这里插入图片描述
    缺点1:每次都提交事务,会影响性能,处理时间可能更长(本次实验过程耗时10分钟),但不至于出现因事务过大而出现的进退两难。

    缺点2:可能因频繁提交事务带来的lgwr进程繁忙导致的性能问题

    优势1:出现异常中断,可以通过辅助方法判断下一次插入的位置,减少工作量

    优势2:由于中途有提交事务,可以观测到插入的速度,推断出完成所需要的大致时间

    第三种方法:row by row + 分批commit
    在这里插入图片描述
    劣势1:虽然分多次提交,比方法二科学(处理时间有明显提高),但是由于仍是逐行处理,处理速度仍然没有上去
    优势1:出现异常中断,可以通过辅助方法判断下一次插入的位置,减少工作量
    优势2:可以观测到插入的速度,推断出完成所需要的大致时间

    第四种方法:array方式
    在这里插入图片描述
    方法4不采用逐行处理,分批提交天然形成,速度大幅提升,建议使用

    第五种方法:手动分拆,

    insert into ext_scan_objects6 select * from ext_scan_objects where mod(object_id,5) = 0;

    insert into ext_scan_objects6 select * from ext_scan_objects where mod(object_id,5) = 1;

    insert into ext_scan_objects6 select * from ext_scan_objects where mod(object_id,5) = 2;

    insert into ext_scan_objects6 select * from ext_scan_objects where mod(object_id,5) = 3;

    insert into ext_scan_objects6 select * from ext_scan_objects where mod(object_id,5) = 4;

    –一种较为"笨拙"的简单分拆方法,容易理解

    –对于特大表毫无意义,并且消耗资源较多

    第六种方法:set based:将要做的事情“囫囵”的告诉Oracle,该种方法性能较好
    在这里插入图片描述
    通过上面的实验证明,完成同样的任务,使用不同的方法,消耗的时间和资源都完全不一样。作为一个数据工作者,尤其是数仓工程师,相信这篇文章会给您带来一些启示。

    展开全文
  • 海量数据插入性能测试11.2.0.2的RAC系统中原本有一张大的分区表,之前为了测试exchange分区的性能需要将这张分区表上的部分分区数据复制到测试用表上,因为数据量比较大所以记以录之:磁盘不太给力hdparm -tT /dev/...

    海量数据插入性能测试

    11.2.0.2的RAC系统中原本有一张大的分区表,之前为了测试exchange分区的性能需要将这张分区表上的部分分区数据复制到测试用表上,因为数据量比较大所以记以录之:

    磁盘不太给力

    hdparm -tT /dev/sdd

    /dev/sdd:

    Timing cached reads: 13672 MB in 2.00 seconds = 6840.55 MB/sec

    Timing buffered disk reads: 605 MB in 3.02 seconds = 200.33 MB/sec

    cat /proc/cpuinfo |grep processor|wc -l

    8

    直接将源分区插入到目标分区表中

    SQL> select count(*) from sales_history partition (SALES_1996) ;

    COUNT(*)

    ----------

    2568089600

    SQL> select (bytes) / 1024 / 1024, segment_name, partition_name

    2 from dba_segments

    3 where segment_name = 'SALES_HISTORY'

    4 order by bytes desc

    5 /

    (BYTES)/1024/1024 SEGMENT_NAME PARTITION_NAME

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

    288710 SALES_HISTORY SALES_1996

    232 SALES_HISTORY SALES_H2_1997

    232 SALES_HISTORY SALES_H1_1997

    SQL> set timing on;

    SQL> alter session enable parallel dml;

    Session altered.

    SQL> insert /*+ append parallel(ss,4) */

    2 into sales ss

    3 select /*+ parallel(sh,4) */ * from sales_history partition(SALES_1996) sh ;

    Elapsed: 01:01:08.03 -- 耗时61分钟

    SQL> commit;

    Commit complete.

    Elapsed: 00:00:00.19

    Workarea Size

    SQL> SELECT

    2 sql_id,

    3 operation_type,

    4 policy,

    5 active_time,

    6 work_area_size,

    7 expected_size,

    8 actual_mem_used,

    9 max_mem_used,

    10 number_passes,

    11 tempseg_size

    12 FROM (SELECT swa.workarea_address,

    13 swa.sql_id,

    14 sa.sql_text,

    15 swa.operation_type,

    16 swa.policy,

    17 swa.sid,

    18 swa.active_time / 1000 active_time,

    19 swa.work_area_size,

    20 swa.expected_size,

    swa.actual_mem_used,

    swa.max_mem_used,

    swa.number_passes,

    swa.tempseg_size,

    swa.tablespace,

    (CASE

    WHEN sl.totalwork <> 0 THEN

    sl.sofar / sl.totalwork

    21 22 23 24 25 26 27 28 29 ELSE

    30 NULL

    31 END) complete_ratio,

    32 sl.elapsed_seconds * 1000 elapsed,

    33 sl.time_remaining * 1000 time_remaining,

    34 sl.opname,

    35 s.machine,

    s.program,

    36 37 s.module,

    38 s.osuser,

    39 NVL(DECODE(TYPE,

    40 'BACKGROUND',

    41 'SYS (' || b.ksbdpnam || ')',

    42 s.username),

    43 SUBSTR(p.program, INSTR(p.program, '('))) username,

    44 ROW_NUMBER() OVER(PARTITION BY swa.sql_id ORDER BY sl.last_update_time DESC) rnum

    45 FROM v$sql_workarea_active swa,

    46 v$sqlarea sa,

    47 (SELECT * FROM v$session_longops WHERE sofar <> totalwork) sl,

    48 v$session s,

    49 v$process p,

    50 x$ksbdp b

    51 WHERE sl.sid(+) = swa.sid

    52 AND sl.sql_id(+) = swa.sql_id

    53 AND swa.sid <> USERENV('sid')

    54 AND sa.sql_id = swa.sql_id

    55 AND s.sid = swa.sid

    56 AND s.paddr = p.addr

    57 AND b.inst_id(+) = USERENV('INSTANCE')

    58 AND p.addr = b.ksbdppro(+)

    59 ORDER BY swa.number_passes DESC, swa.work_area_size DESC)

    60 WHERE rnum = 1

    61 /

    SQL_ID OPERATION_TYPE POLICY ACTIVE_TIME WORK_AREA_SIZE EXPECTED_SIZE ACTUAL_MEM_USED MAX_MEM_USED NUMBER_PASSES TEMPSEG_SIZE

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

    ak9ht406k4zn4 LOAD WRITE BUFFERS AUTO 889394.542 541696 1048576 541696 541696 0

    SQL> alter session set workarea_size_policy=MANUAL;

    Session altered.

    Elapsed: 00:00:00.04

    SQL> alter session set sort_area_size=314572800;

    Session altered.

    Elapsed: 00:00:00.00

    SQL> alter session set sort_area_size=314572800;

    Session altered.

    创建索引

    create index ind_sales on sales(prod_id,cust_id,time_id,channel_id) nologging parallel 8

    /

    Index created.

    Elapsed: 01:04:12.68

    SQL>@sort_activity

    SQL_ID OPERATION_TYPE POLICY ACTIVE_TIME/1000 WORK_AREA_SIZE EXPECTED_SIZE ACTUAL_MEM_USED MAX_MEM_USED NUMBER_PASSES TEMPSEG_SIZE_IN_GB

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

    490ntjgc2dass SORT (v2) MANUAL 1275.18291 0 287324160 310392832 1 6.94238281

    SQL> set linesize 200 pagesize 1400

    SQL> col opname for a20

    SQL> select opname,totalwork,units,elapsed_seconds,sql_plan_options from v$session_longops where opname='Sort Output';

    OPNAME TOTALWORK UNITS ELAPSED_SECONDS SQL_PLAN_OPTIONS

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

    Sort Output 1528129 Blocks 1809 CREATE INDEX

    Sort Output 1529098 Blocks 1701 CREATE INDEX

    ©著作权归作者所有:来自51CTO博客作者maclean_007的原创作品,如需转载,请注明出处,否则将追究法律责任

    展开全文
  • 于是工作中在使用Spark-Redis时也会碰到很多问题,尤其是执行海量数据插入与查询的场景中。本文分享自华为云社区《Spark-Redis工作篇:执行海量数据插入、查询作业时碰到的问题》,原文作者:我爱次火锅锅 。海量...

    摘要:由于redis是基于内存的数据库,稳定性并不是很高,尤其是standalone模式下的redis。于是工作中在使用Spark-Redis时也会碰到很多问题,尤其是执行海量数据插入与查询的场景中。

    本文分享自华为云社区《Spark-Redis工作篇:执行海量数据插入、查询作业时碰到的问题》,原文作者:我爱次火锅锅 。

    海量数据查询

    Redis是基于内存读取的数据库,相比其它的数据库,Redis的读取速度会更快。但是当我们要查询上千万条的海量数据时,即使是Redis也需要花费较长时间。这时候如果我们想要终止select作业的执行,我们希望的是所有的runningtask立即killed。

    Spark是有作业调度机制的。SparkContext是Spark的入口,相当于应用程序的main函数。SparkContext中的cancelJobGroup函数可以取消正在运行的job。

    c5630223763bf5e42ee23a356899970b.png

    按理说取消job之后,job下的所有task应该也终止。而且当我们取消select作业时,executor会throwTaskKilledException,而这个时候负责task作业的TaskContext在捕获到该异常之后,会执行killTaskIfInterrupted。

    eccf1d7812bcbc5afdfd33581d2453d1.png

    但是Spark-Redis中还是会出现终止作业但是task仍然running。因为task的计算逻辑最终是在RedisRDD中实现的,RedisRDD的compute会从Jedis中取获取keys。所以说要解决这个问题,应该在RedisRDD中取消正在running的task。这里有两种方法:

    方法一:参考Spark的JDBCRDD,定义close(),结合InterruptibleIterator。

    e61e02deabc1b494a52b50c252f0bfee.png

    方法二:异步线程执行compute,主线程中判断task isInterrupted

    b7439ad48a7b74defb48fb205991d2df.png

    我们可以异步线程来执行compute,然后在另外的线程中判断是否taskisInterrupted,如果是的话就执行TaskContext的killTaskIfInterrupted。防止killTaskIfInterrupted无法杀掉task,再结合InterruptibleIterator:一种迭代器,以提供任务终止功能。通过检查[TaskContext]中的中断标志来工作。

    海量数据插入

    我们都已经redis的数据是保存在内存中的。当然Redis也支持持久化,可以将数据备份到硬盘中。当插入海量数据时,如果Redis的内存不够的话,很显然会丢失部分数据。这里让使用者困惑的点在于: 当Redis已使用内存大于最大可用内存时,Redis会报错:commandnot allowed when used memory > ‘maxmemory’。但是当insert job的数据大于Redis的可用内存时,部分数据丢失了,并且还没有任何报错。

    因为不管是Jedis客户端还是Redis服务器,当插入数据时内存不够,不会插入成功,但也不会返回任何response。所以目前能想到的解决办法就是当insert数据丢失时,扩大Redis内存。

    总结

    Spark-Redis是一个应用还不是很广泛的开源项目,不像Spark JDBC那样已经商业化。所以Spark-Redis还是存在很多问题。相信随着commiter的努力,Spark-Redis也会越来越强大。

    点击关注,第一时间了解华为云新鲜技术~

    展开全文
  • mysql海量数据插入

    千次阅读 2011-05-10 09:24:00
    mysql海量数据插入可以使用构造SQL语句的方法,mysql支持一条SQL语句,插入多条记录。(ORACLE不支持)SQL:INSERT INTO tb_name VALUES (record1),(record1),(record1),(record1);需要注意的是,mysql有设置接收sql...

    mysql海量数据插入可以使用构造SQL语句的方法,

    mysql支持一条SQL语句,插入多条记录。

    (ORACLE不支持,MSSQL支持)

    SQL:

    INSERT INTO tb_name VALUES (record1),(record1),(record1),(record1);

    需要注意的是,mysql有设置接收sql语句的大小,所有构造的记录不能超过其限制,

    举例:

    构造1W条记录的SQL语句正常插入,但是超过2W条插入的话,程序会报错;也就是说

    构造的SQL语句尽量不要大于100K,尽量避免网络连接等方面出现的问题。

    展开全文
  • Sql Server海量数据插入

    2016-11-30 21:29:00
    目录 1.前言 2.BULK INSERT ... 对于海量数据,上百万上千万的数据插入,我们用ADO.NET提供的普通一条一条数据插入非常非常慢,好在Sql Server为我们提供了批量插入方法。 BULK INSERT  语...
  • 于是工作中在使用Spark-Redis时也会碰到很多问题,尤其是执行海量数据插入与查询的场景中。 海量数据查询 Redis是基于内存读取的数据库,相比其它的数据库,Redis的读取速度会更快。但是当我们要查询上千万条的...
  • 因此,优化数据库插入性能是很有意义的。修改mysql数据库配置:0. 最快的当然是直接 copy 数据库表的数据文件(版本和平台最好要相同或相似);1. 设置 innodb_flush_log_at_trx_commit=0 ,相对于...
  • 近日由于工作需要,需要对海量数据(1亿条)放入到redis中,于是开启了幸运(磨难)之旅。 一 旅途概述。 旅途目的:携带海量数据,并将海量数据运送到redis内存服务器 旅途意义:放入redis之后供其它系统模块...
  • 使用JDBC连接数据库时,如果插入数据量大,一条一条地插入数据会变得非常缓慢。此时,我们需要用到预处理。 查阅Java开发文档,我们可以看到: 接口 PreparedStatement 表示预编译的 SQL 语句的对象。 SQL ...
  • 使用JDBC连接数据库时,如果插入数据量大,一条一条地插入数据会变得非常缓慢。此时,我们需要用到预处理。查阅Java开发文档,我们可以看到:接口 PreparedStatement表示预编译的 SQL 语句的对象。SQL 语句被预...
  • 对于一些数据量较大的...因此,优化数据库插入性能是很有意义的。 修改mysql数据库配置: 0. 最快的当然是直接 copy 数据库表的数据文件(版本和平台最好要相同或相似);1. 设置 innodb_flush_log_at_trx_commit...
  • 11.2.0.2的RAC系统中原本有一张大的分区表,之前为了测试exchange分区的性能需要将这张分区表上的部分分区数据复制到测试用表上,因为数据量比较大所以记以录之: 磁盘不太给力 hdparm -tT /dev/sdd /dev/sdd: ...
  • BULK INSERT 语法 参数说明  database_name  指定的表或视图所在的数据库的名称,如果未指定,则默认为当前数据库。... 数据文件的完整路径,该数据文件包含到导入到指定表或视图中的数据。使用BULK...
  • 海量数据插入数据库的快速方案

    千次阅读 2016-02-26 16:04:40
    在我们开发项目过程中,一般都会遇到大批量的数据导入。比如根据订购日志来生成订购记录。经过查询资料发现了2种比较快速的方法:  方法一 需要对日志文件做解析出来的。  public class JDBCMoreQuick { ...
  • 摘要:使用.NET相关技术向数据库中插入海量数据是常用操作。本文对比ADO.NET和LINQ两种技术,分别使用SqlBulkCopy()和InsertAllOnSubmit()方法进行操作。得出结论:相同插入工作量(1w条数据)插入效率相差200倍之巨!...
  • c# 海量数据插入sql 2005数据库

    千次阅读 2013-12-24 16:02:43
    在面对BW,KW,WW级别的数据时,用insert into已经远远不能满足人类所能接受的底线,于是SQL 2005及后期版本中均有一大秒赞的方法SqlBulkCopy,土豪金为白富美和高富帅准备的,那么SqlBulkCopy就是为我们苦逼程序猿...
  • 摘要:使用.NET相关技术向数据库中插入海量数据是常用操作。本文对比ADO.NET和LINQ两种技术,分别使用SqlBulkCopy()和InsertAllOnSubmit()方法进行操作。得出结论:相同插入工作量(1w条数据)插入效率相差200倍之巨!...
  • Spark 是专为大规模数据处理而设计的快速通用的计算引擎,起源于UC Berkeley AMP lab的一个研究项目。相比传统的Hadoop(MapReduce) ,Spark的性能快...
  • 现在我用Java JPA做一个项目,里面有一张特别重要,每天有3800对这张表进行添加数据,这个怎样做才能实现优化,或者减轻对这张表的读写??????
  • <p>This question already has an answer here: ... <a href="/questions/8474926/how-to-insert-20-million-record-into-mysql-database-as-fast-as-possible" dir="ltr">How to insert 20 million record ...
  • 摘要:使用.NET相关技术向数据库中插入海量数据是常用操作。本文对比ADO.NET和LINQ两种技术,分别使用SqlBulkCopy()和InsertAllOnSubmit()方法进行操作。得出结论:相同插入工作量(1w条数据)插入效率相差200倍之巨...
  • 摘要:使用.NET相关技术向数据库中插入海量数据是经常使用操作。本文对照ADO.NET和LINQ两种技术。分别使用SqlBulkCopy()和InsertAllOnSubmit()方法进行操作。得出结论:同样插入工作量(1w条数据)插入效率相差200倍...
  • C# 利用SqlBulkCopy 高性能批量插入海量数据 高效批量插入数据
  • 多线程插入(单表) 多线程插入(多表) ...答:在数据里做插入操作的时候,整体时间的分配是这样的: 链接耗时 (30%) 发送query到服务器 (20%) 解析query (20%) 插入操作 (10% * 词条数目) 插入index ...
  • 对于海量数据插入和更新,ADO.NET确实不如JDBC做到好,JDBC有统一的模型来进行批操作.使用起来 非常方便: PreparedStatement ps = conn.prepareStatement("insert or update arg1,args2...."); 然后你就可以 for...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 861
精华内容 344
关键字:

海量数据插入