精华内容
下载资源
问答
  • 两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题: 1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,...
  • 挑战极限 Oracle数据库一秒导百万数据 2010年09月07日13:42 来源:李鸣的博客 作者:李鸣 编辑:胡铭娅 评论:2条  本文Tag: Oracle .NET c# 【IT168 技术文档】.Net程序中可以通过ODP调用特性,对Oracle数据库...
    挑战极限 Oracle数据库一秒导百万数据
    2010年09月07日13:42 来源:李鸣的博客 作者:李鸣 编辑:胡铭娅 评论:2条 
    本文Tag: Oracle .NET c#     【IT168 技术文档】.Net程序中可以通过ODP调用特性,对Oracle数据库进行操作,今天来讲一下数据批量插入的功能,所用技术不高不深,相信很多朋友都接触过,小弟班门弄斧了,呵呵。这篇文章是上篇文章的续集,因为上一次试验的征集结果没有突破4秒的方法,所以这次继续挑战与挖掘新方法,虽然是Oracle,但仍具有一定收藏意义。

      上一次文章中提及的试验: 挑战极限 C#百万数据4秒导入SQL Server

      这个试验是针对SQL SERVER数据库的,宿主环境也是.Net,有兴趣的朋友可以将这两个试验对比一下,为日后工作批量导数提供支持。

      另外,一些朋友对上次试验环境有些异议,认为应该对数据库和服务器做优化或设置,以体现试验最终的时间结果。这个固然会影响试验的时间结果,但考虑到在试验环境中,对数据库优化的标准与优化程度不便统一与定量,试验结果也不易说明其影响源,所以这次试验依然以标准数据库建库后的配置为主,试验所在服务器硬件环境与上次试验保持一致。实验目的在于挖掘、对比宿主程序中的数据批量操作方法。

      ● 普通肉垫式

      什么叫批量插入呢,就是一次性插入一批数据,我们可以把这批数据理解为一个大的数组,而这些全部只通过一个SQL来实现,而在传统方式下,需要调用很多次的SQL才可以完成,这就是著名的“数组绑定”的功能。我们先来看一下传统方式下,插入多行记录的操作方式:

    //设置一个数据库的连接串, 
    string connectStr = "User Id=scott;
    Password=tiger;Data Source="; 
    OracleConnection conn = new OracleConnection(connectStr); 
    OracleCommand command = new OracleCommand();
    command.Connection = conn; conn.Open(); 
    Stopwatch sw = new Stopwatch();
    sw.Start(); 
    //通过循环写入大量的数据,这种方法显然是肉垫 
    for
    (int i = 0; i < recc; i++) 
    { string sql = "insert into dept values(" + i.ToString() + "," + i.ToString() + "," + i.ToString() + ")";
    command.CommandText = sql; 
    command.ExecuteNonQuery(); 

    sw.Stop();
    System.Diagnostics.Debug.WriteLine("普通插入:" + recc.ToString() + "所占时间:" + sw.ElapsedMilliseconds.ToString()); 
      我们先准备好程序,但是先不做时间的测定,因为在后面我们会用多次循环的方式来计算所占用的时间。

      ● 使用ODP特性

      看上面的程序,大家都很熟悉,因为它没有用到任何ODP的特性,而紧接着我们就要来介绍一个神奇的程序了,我们看一下代码,为了更直观,我把所有的注释及说明直接写在代码里:

    //设置一个数据库的连接串 
    string connectStr = "User Id=scott;Password=tiger;
    Data Source=";
    OracleConnection conn = new OracleConnection(connectStr); 
    OracleCommand command = new OracleCommand();
    command.Connection = conn;
    //到此为止,还都是我们熟悉的代码,下面就要开始喽 //这个参数需要指定每次批插入的记录数 
    command.ArrayBindCount = recc; 
    //在这个命令行中,用到了参数,参数我们很熟悉,但是这个参数在传值的时候 
    //用到的是数组,而不是单个的值,这就是它独特的地方 command.CommandText = "insert into dept values(:deptno, :deptname, :loc)"; 
    conn.Open(); 
    //下面定义几个数组,分别表示三个字段,数组的长度由参数直接给出 
    int[] deptNo = new int[recc]; 
    string[]
    dname = new string[recc]; 
    string[] loc = new string[recc]; 
    // 为了传递参数,不可避免的要使用参数,下面会连续定义三个
    // 从名称可以直接看出每个参数的含义,不在每个解释了 OracleParameter deptNoParam = new OracleParameter("deptno", OracleDbType.Int32); 
    deptNoParam.Direction = ParameterDirection.Input;
    deptNoParam.Value = deptNo; 
    command.Parameters.Add(deptNoParam); 
    OracleParameter deptNameParam = new OracleParameter("deptname", OracleDbType.Varchar2); 
    deptNameParam.Direction = ParameterDirection.Input; 
    deptNameParam.Value = dname;
    command.Parameters.Add(deptNameParam); 
    OracleParameter deptLocParam = new OracleParameter("loc", OracleDbType.Varchar2);
    deptLocParam.Direction = ParameterDirection.Input;
    deptLocParam.Value = loc; command.Parameters.Add(deptLocParam); 
    Stopwatch sw = new Stopwatch(); 
    sw.Start();
    //在下面的循环中,先把数组定义好,而不是像上面那样直接生成SQL 
    for
    (int i = 0; i < recc; i++) { deptNo[i] = i;
    dname[i] = i.ToString(); 
    loc[i] = i.ToString(); 
    }
    //这个调用将把参数数组传进SQL,同时写入数据库 
    command.ExecuteNonQuery();
    sw.Stop();
    System.Diagnostics.Debug.WriteLine("批量插入:" + recc.ToString() + "所占时间:" +sw.ElapsedMilliseconds.ToString()); 


      以上代码略显冗长,但是加上注释后基本也就表达清楚了。

      好了,到目前为止,两种方式的插入操作程序已经完成,就剩下对比了。我在主函数处写了一个小函数,循环多次对两个方法进行调用,并且同时记录下时间,对比函数如下:

    for (int i = 1; i <= 50; i++) { Truncate(); OrdinaryInsert(i * 1000); Truncate(); BatchInsert(i * 1000); } 
      
           当数据量达到100万级别时,所用时间依然令人满意,最快一次达到890毫秒,一般为1秒左右。

      经过试验,得出一组数据,可以看出两种方式在效率方面惊人的差距(占用时间的单位为毫秒),部分数据如下:

    记录数  标准  批处理  
    1000  1545  29  
    2000 3514  20  
    3000 3749  113  
    4000 5737  40  
    5000 6820  52  
    6000 9469  72  
    7000 10226  69  
    8000 15280  123  
    9000 11475  83  
    10000 14536  121  
    11000 15705  130  
    12000 16548  145  
    13000 18765  125  
    14000 20393  116  
    15000 22181  159  

      因为篇幅原因,不再粘贴全部的数据,但是我们可以看一下由此数据生成的散点图:




      其中有些数据有些跳跃,可能和数据库本身有关系,但是大部分数据已经能说明问题了。看了这些数据后,是不是有些心动了?

      源程序放了一段时间直接拷贝贴过来了,可能需要调试一下才能跑通,不过不是本质性问题,对了如果要测试别忘记安装Oracle访问组件。
    展开全文
  • oracle数据库高效插入千万条数据

    万次阅读 2018-08-06 17:19:25
    向ACCOUNTING_VOUCHER 表中插入千万条数据  思路:   1.新建一张和ACCOUNTING_VOUCHER数据库表结构一致的临时表,ACCOUNTING_VOUCHER_TEMP  2.向临时表ACCOUNTING_VOUCHER_TEMP中插入10条数据  3.使用...

    向ACCOUNTING_VOUCHER 表中插入千万条数据

        思路:   

            1.新建一张和ACCOUNTING_VOUCHER数据库表结构一致的临时表,ACCOUNTING_VOUCHER_TEMP

            2.向临时表ACCOUNTING_VOUCHER_TEMP中插入10条数据

           3.使用insert select的方式做表复制

      注意事项:

          如果数据库表中有唯一约束可以新建一个SEQUENCE,使用SEQUENCE进行插入

          插入数据之前先删除索引和唯一约束,设置执行脚本为nologging

     详细sql如下:

    创建序列    

    CREATE SEQUENCE OdinSeqTest

     

    INCREMENT BY 1 -- 每次加几个

     

    START WITH 1 -- 从1开始计数

     

    NOMAXvalue -- 不设置最大值

     

    NOCYCLE -- 一直累加,不循环

     

    CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE

    调用序列,插入一亿条数据

       

    alter table nacc.T_ACC_VOUC_DET_TEST nologging;

    declare 

    num NUMBER;

    begin

       for v_rlt in 1..1000000 loop

            INSERT INTO NACC.T_ACC_VOUC_DET_TEST SELECT T_ACC_VOUC_DET_ACC_NO_SE.NextVal, 'TF'||T_ACC_VOUC_DET_TRANS_FLOW_SE.NextVal, 'SF'||T_ACC_VOUC_DET_SYS_FLOW_ID_SE.NextVal, "TRANS_TYPE", "BUSI_CODE" FROM NACC.T_ACC_VOUC_DET_TEST_BAK;

        num:=num+1;

           IF Mod(num,5000)=0 THEN 

               COMMIT; 

            END IF; 

       end loop;

    end;

    展开全文
  • oracle 事务隔离级别 事务不同引发的状况: 脏读(Dirty reads) 一个事务读取另一个事务尚未提交的修改时,产生脏读 很多数据库允许脏读以避免排它锁的竞争。 不可重复读(Nonrepeatable reads) 同一查询在同一事务中...
  • ORACLE数据库事务隔离级别   事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度。 两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题: 1、幻想读:事务T1读取一条指定where条件...

    转自:http://www.cnblogs.com/jackal/archive/2011/02/14/1954231.html

     

    ORACLE数据库事务隔离级别

     

    事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度。

    两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:

    1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。

    2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。

    3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。

    为了处理这些问题,SQL标准定义了以下几种事务隔离级别

    READ UNCOMMITTED 幻想读、不可重复读和脏读都允许。

    READ COMMITTED 允许幻想读、不可重复读,不允许脏读

    REPEATABLE READ 允许幻想读,不允许不可重复读和脏读

    SERIALIZABLE 幻想读、不可重复读和脏读都不允许

    Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读

    SQL标准所定义的默认事务隔离级别是SERIALIZABLE,但是Oracle 默认使用的是READ COMMITTED

    设置隔离级别使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

    下面是oracle 设置SERIALIZABLE隔离级别一个示例:

    左面是事务T1,右面是事务T2,因为T2级别为SERIALIZABLE,所以即使事务T1在提交了数据之后,事务T2还是看不到T1提交的数据,幻想读和不可重复读都不允许了。

    那如何能查看到T1新增的记录呢? 上面T1和T2是并发执行,在T1执行insert的时候事务T2已经开始了,因为T2级别是SERIALIZABLE,所以T2所查询的数据集是T2事务开始前数据库的数据。即事务T1在事务T2开始之后的insert和update操作的影响都不会影响事务T2。现在重新开启一个事务T3 就可以看到T1新增的记录了。

    当下列事件发生时,事务就开始了:

    1、连接到数据库,并执行第一条DML语句

    2、前一个事务结束后,又输入了另一条DML语句

    展开全文
  • 有两个Oracle数据库,分别布置在不同的服务器上,系统均为windows2003; 这里暂且说成是一个主数据库和从数据库: (1) 主数据库: oracle_A ; (2) 从数据库: oracle_B ; 在oracle_A中有一个表table_A与oracle_B...

    一:问题描述

    有两个Oracle数据库,分别布置在不同的服务器上,系统均为windows2003;

    这里暂且说成是一个主数据库和从数据库:

    (1) 主数据库: oracle_A ;

    (2) 从数据库: oracle_B ;

    在oracle_A中有一个表table_A与oracle_B中的表table_B 结构相同 ;

    我是处在oracle_B,oracle_A数据库分配给我有一个访问oracle_A表table_A的用户,该用户 只拥有查询的权限 ;

    另外,需要 说明的一点 ,就是在oracle_B处,只需对table_B表进行查询的操作,不进行其他增删改的操作。

    场景介绍完了, 我的问题 的是,如何在oracle_A中表table_A发生变化时,实时更新同步到oracle_B的table_B中?

    我原来的处理方式:

    通过建立远程连接DBLink+JOB定时任务+存储过程的方式,实现了定时同步 更新,但不能做到实时同步 。

    二:采用同义词+DB_Link的方式结果步骤

    之所以能够选择采用同义词的方式,处理这个问题。主要还是源于在问题描述中提到一个点,那就是我们只需要对同步后的表进行 查询 操作。这点是使用同义词方式的重要要素。

    下面详细模拟一下整个实验测试的过程:

    (1)首先在Oracle_A端创建一个对table_A只有查询功能的用户

    1. 创建用户
      sqlplus /nolog
      conn /as sysdba;
      create user username identified by password;

    2. 查看所有的用户列表
      用户创建完成后,查看用户是否创建成功
      select * from all_users;

    3. 授予权限
      为了能够保证能够登陆,必须赋予如下权限

      • 授予username用户创建session的权限,即登陆权限
        grant create session to username;

      • 授予username用户使用表空间的权限
        grant unlimited tablespace to username;

      • oracle对权限管理比较严谨,普通用户之间也是默认不能互相访问的,需要互相授权.

      • 如果scott用户要授权给username用户查看自己的test表的权限;
        sqlplus scott/tiget@localhost:1521/orcl

      • 授予username用户查看指定的权限
        grant select on test to username;

      • 撤销权限
        基本语法同grant,关键字为revoke;

    (2)验证用户是否可以成功登录,并进行访问授权的表

    使用sqlplus登录,并进行查询

    sqlplus username/password@localhost:1521/orcl;
    select * from scott.test;
    

    注意:查询表时,务必带上用户名,说明是哪个用户下的表。

    1. 创建远程连接 db_link
        create public database link db32 connect to tianzhi_test identified by "tianzhi_test" using '192.168.56.6:1521/ORCL'
    1. 测试远程连接是否成功
        select * from tianzhi_smart.zh_item_news@db32;

    (4)在Oracle_B端创建同义词

    1. 使用sqlplus登录自己的用户
    sqlplus tianzhi_smart/tianzhi_smart@localhost:1521/orcl
    1. 创建同义词
    create or replace public synonym TEST1130 for scott.TEST@db32;

    3.查询测试

    select * from TEST1130;

    可以看到这与在Oracle_A源数据库中查到的table_A表中的数据一样.
    注意事项:

    当远程查询的数据库中包含BLOB字段时,会报出如下错误.

      ORA-22992: 无法使用从远程表选择的 LOB 定位器

    当出现这个错误的时候,那是因为跨库连接查询中的表中存在BLOB类型的字段,所以一定要注意,所有表中存在blob类型字段,

    不能用 select * from 连接的表
    不能将blob类型的字段出现在脚本中。
    如果这些blob类型的字段一定要导过来,可以先建立临时表再插入本地表,方法如下.在pl/sql中执行

    第一步 建临时表

    create global temporary table foo ( X BLOB )
    on commit delete rows;

    第二步 插入本地表

    insert into foo select blobcolumn from remoteTable@dl_remote ;
    展开全文
  • JDBC实现一次向Oracle数据库表中插入1千万条数据 说明:环境为eclipse + jdk1.7 所需jar包:ojdbc6-11.2.0.1.0.jar 亮点:使用PreparedStatement + addBatch()方法(实现了秒级的插入速度) 1、变多次提交为一次 2、...
  • JDBC ORACLE 数据库隔离级别

    千次阅读 2015-08-26 10:04:29
    数据库的隔离级别: 于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题: 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. ...
  • 近期为了满足客户的(××电网公司)需求,先说下他们的需求,...3.同步需要保证实时性,数据都是秒级的,一分钟下来至少是2万条数据。   看到这个需求我的第一反应估计跟大家是一样的,就是建立外连接,然后使用mer
  • 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。 √: 可能出现 ×: 不会出现
  • ORACLE数据库事务隔离级别 事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度。 两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题: 1、幻想读:事务T1读取一条指定where条件的...
  • 需求:数据迁移,从远端数据库查询数据写入到生产库中。遇到问题,数据量为千万级别(具体是6千多万条记录的数据),直接使用insert into 目标表 select * from 数据源表。因为目标表本身有上千万数据,且有主键和索引...
  • spring中事物传播机制为七中类型。如图: 事物的ACID特性: 原子性(Atomicity):事务作为一个整体被执行,包含在...一致状态的含义是数据库中的数据应满足完整性约束。 隔离性(Isolation):多个事务...
  • ORACLE数据库数据类型

    千次阅读 2019-11-28 17:51:42
    Oracle数据类型 Oracle数据类型分为标量(Scalar)类型、复合(Composite)类型、引用(Reference)类型和LOB(Large Object)类型4种类型。 因为标量类型没有内部组件,所以,它又分为四类:数值、字符、...
  • 备份表中存储不活跃的数据eg:只有查询操作的数据(数据的部分属性字段不再更改)且查询次数也较少; 备份表可以是一张或者多张备份表,若采用多张备份表,则定期创建备份表(备份表的命名要规范,可以考虑使用原表名称...
  • 浅谈oracle数据库隔离级别

    千次阅读 2018-09-19 11:50:03
    事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑...
  • Oracle数据库 基础

    千次阅读 多人点赞 2020-02-21 11:15:20
    1,能够理解Oracle数据库的基本概念 2,记忆Oracle DDL语句 3,掌握Oracle序列的使用 4,掌握oracle单行函数的使用 5,能够掌握oracle多行函数 6,学习并应用oracle分组统计 7,能够应用Oracle多表查询 8,掌握...
  • 如果你要把Oracle里的大量数据(80M以上)转移到另外的用户,另外的表空间里。可以用下面介绍的快速转移数据的方法。 一、建新表的方式 create table target_tablename tablespace target_tabl
  • Oracle数据库数据处理

    千次阅读 2017-01-06 08:31:06
    SQL> SQL的类型SQL> 1. DML(Data Manipulation Language 数据操作语言):insert update delete select SQL> 2. DDL(Data Definition Language 数据定义语言): create/drop/alter/truncate table SQL>
  • 一、并发性带来的问题 ...  当一个事务读取另一个正在进行的事务更新但未永久提交到数据库数据时,发生脏读。 2、幻读   假如你正从一个表读数据(select),一段时间后,又重新执行一遍查询,...
  • Oracle数据库入门

    千次阅读 2018-11-22 22:22:31
    Oracle数据库 Oracle数据库与Mysql数据库的区别 a.Oracle是大型数据库,Mysql是中小型数据库。 b.Oracle支持大并发,大访问量,是OLTP最好的工具。 c.在数据处理上也存在一些区别 1.主键:Mysql采用的是自增长主键,...
  • oracle数据库笔记

    千次阅读 2018-09-13 12:52:30
    oracle数据库笔记 oracle数据库笔记 数据库四种语言: 1.DDL (Data Definition Language )数据库定义语言 statements are used to define the database structure or schema. 创建表: 删除表: 修改表: ...
  • Oracle数据库简介

    千次阅读 2017-02-24 16:47:58
    Oracle数据库简介 本章提供了Oracle数据库的概述,包含以下部分: 关于关系数据库 架构对象 数据访问 事务管理 Oracle数据库架构 Oracle数据库文档路线图 关于关系...
  • Oracle 数据库体系结构

    2018-11-17 15:52:03
    数据库与实例 数据库存储结构 数据库实例结构 应用及网络体系结构 文章翻译源于 Oracle Database Database Concepts, 18c。 数据库服务器是现代信息系统中的一个关键组件。
  • Oracle数据库

    千次阅读 2018-01-16 09:28:45
    Oracle第一章数据库概述什么是数据库?定义:数据库是长期存储在计算内,有组织的,可共享的数据集合数据库中的数据指的是以一定的数据模型组织,描述,存储在一起。简单理解:数据库是按照数据结构来组织、存储、...
  • DML(data manipulation language 数据操作语言):insert update delete select 2. DDL(data definition language 数据定义语言): create table,alter table,drop table,truncate table create/drop view,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,013
精华内容 20,005
关键字:

oracle数据库插入百万级别数据