葡京网投哪个正规 > 新葡亰-数据 > 探讨Oracle数据库的数据导入方法,Oracle数据库数据导入方法

原标题:探讨Oracle数据库的数据导入方法,Oracle数据库数据导入方法

浏览次数:120 时间:2020-03-24

每种数据库管理员都相会前遇到数据导入的主题材料,那有相当的大可能率产生在数据库的新老移植进程中,或许是在数据库崩溃后的余烬复起重新创立进程中,还大概有相当的大只怕是在成立测量试验数据库的依葫芦画瓢条件经过中,同理可得作为一名合格的数据库管理员,你应有压实接收各种数据导入央求的本事储备,同不时间还要尽恐怕满意人本能的对导入速度的苛求。本文仅针对 Oracle 数据库所提供的增长速度数据导入的种种风味和技艺扩充研究,此中的一对艺术也得以转账应用于任何数据库。以下四种多少导入方法哪个最适用须求针对具体情状具体深入分析,笔者也顺手列举了震慑导入速度的各个因素供讨论。为了比较各个数码导入方法的功用,作者创设了示例表和数据集,并用各样艺术导入示例数据集来总计总体导入时间和导入进程占用 CPU 时间,这里得出的时光仅供参谋。要求验证的是,提出您利用 Oracle 9i 集团版数据库,当然你也足以品尝采取 Oracle 7.3 以上的标准版数据库。本文使用的机器配置为:CPU Intel P4,内存256M,数据库 Oracle 9i 集团版。

示例表结会谈数据集

命名空间:Oracle.DataAccess.Client

示例表结议和数据集

为了演示和相比各个数码导入方法,作者只要数据导入职分是将表面文件数量导入到 Oracle 数据库的CALLS表中,外部数据文件包括十万条呼叫大旨记录,将近 6MB 的文件大小,具体的数目示举例下:

组件:Oracle.DataAccess.dll(2.112.1.0)

为了演示和相比较各类数据导入方法,小编假使数据导入任务是将表面文件数量导入到 Oracle 数据库的CALLS表中,外界数据文件包涵十万条呼叫宗旨记录,将近 6MB 的文件大小,具体的数额示比方下:

82302284384,2004-04-18:13:18:58,5001,投诉,手提式有线电电话机三包维修品质82302284385,二〇〇三-04-18:13:18:59,3352,咨询,供水热线的编号82302284386,二零零三-04-18:13:19:01,3142,提议,增设公交线路

ODP.NET 版本:ODP.NET for .NET Framework 2.0 或 ODP.NET for .NET Framework 4

82302284384,二〇〇三-04-18:13:18:58,5001,控诉,手提式有线电话机三包维修质量82302284385,二〇〇四-04-18:13:18:59,3352,咨询,供水热线的号子82302284386,二〇〇〇-04-18:13:19:01,3142,提出,增设公共交通线路

收受导入数据的表名是 CALLS,表布局如下:

工具:Microsoft Visual Studio Ultimate 2013 + Oracle SQL Developer 1.5.5 + Oracle Database 11g Enterprise Edition 11.2.0.1.0(32位) + TNS for 32-bit Windows 11.2.0.1.0

收受导入数据的表名是 CALLS,表布局如下:

Name Null? Type Comment------------ --------- ------------- -----------------CALL_ID NOT NULL NUMBER Primary keyCALL_DATE NOT NULL DATE Non-unique indexEMP_ID NOT NULL NUMBERCALL_TYPE NOT NULL VARCHAR2(12)DETAILS VARCHAR2(25)

 

Name Null? Type Comment------------ --------- ------------- -----------------CALL_ID NOT NULL NUMBER Primary keyCALL_DATE NOT NULL DATE Non-unique indexEMP_ID NOT NULL NUMBERCALL_TYPE NOT NULL VARCHAR2(12)DETAILS VARCHAR2(25)

次第数据插入INSERT

方式一:ArrayBind

当插入一条数据时,SQL 语句如下:

INSERT INTO table_name VALUES (:col1, :col2, :col3, :col4, :col5)

  1 public void InsertDataRow(Dictionary<string, object> dataRow)
  2 {
  3     StringBuilder sbCmdText = new StringBuilder();
  4     sbCmdText.AppendFormat("INSERT INTO {0}(", m_TableName);
  5     sbCmdText.Append(string.Join(",", dataRow.Keys.ToArray()));
  6     sbCmdText.Append(") VALUES (");
  7     sbCmdText.Append(":" + string.Join(",:", dataRow.Keys.ToArray()));
  8     sbCmdText.Append(")");
  9 
 10     using (OracleConnection conn = new OracleConnection())
 11     {
 12         using (OracleCommand cmd = conn.CreateCommand())
 13         {
 14             cmd.CommandType = CommandType.Text;
 15             cmd.CommandText = sbCmdText.ToString();
 16             OracleParameter parameter = null;
 17             OracleDbType dbType = OracleDbType.Object;
 18             foreach (string colName in dataRow.Keys)
 19             {
 20                 dbType = GetOracleDbType(dataRow[colName]);
 21                 parameter = new OracleParameter(colName, dbType);
 22                 parameter.Direction = ParameterDirection.Input;
 23                 parameter.OracleDbTypeEx = dbType;
 24                 parameter.Value = dataRow[colName];
 25                 cmd.Parameters.Add(parameter);
 26             }
 27             conn.Open();
 28             int result = cmd.ExecuteNonQuery();
 29         }
 30     }
 31 }

那个时候,每多个 OracleParameter 的 Value 值都予以单个字段的 叁个具体值,这种也是最棒传统的插入数据的艺术。

Oracle V6 中 OCI 编制程序接口插手了数组接口天性。

当使用 ArrayBind 时,OraleParameter 的 Value 值则是付与单个字段的 一个数组,即多条数据的该字段组合成的三个数组。那个时候 Oracle 仅供给实行一遍SQL 语句,就可以在内存中批量解析并导入数据,缩短程序与数据库之间来回的操作,其亮点便是多少导入的欧洲经济共同体时间鲜明回降,越发是进程占用 CPU 的时日。

如若数据源是 DataTable 类型,首先把 DataTable 数据源,转换来object[][] 类型,然后绑定 OracleParameter 的 Value 值为对应字段的三个 Object[] 数组就能够;仿效代码如下:

  1 /// <summary>
  2 /// 批量插入大数据量
  3 /// </summary>
  4 /// <param name="columnData">列名-列数据字典</param>
  5 /// <param name="dataCount">数据量</param>
  6 /// <returns>插入数据量</returns>
  7 public int InsertBigData(Dictionary<string, object> columnData, int dataCount)
  8 {
  9     int result = 0;
 10     if (columnData == null || columnData.Count < 1)
 11     {
 12         return result;
 13     }
 14     string[] colHeaders = columnData.Keys.ToArray();
 15     StringBuilder sbCmdText = new StringBuilder();
 16     if (columnData.Count > 0)
 17     {
 18         // 拼接INSERT的SQL语句
 19         sbCmdText.AppendFormat("INSERT INTO {0}(", m_TableName);
 20         sbCmdText.Append(string.Join(",", colHeaders));
 21         sbCmdText.Append(") VALUES (");
 22         sbCmdText.Append(m_ParameterPrefix + string.Join("," + m_ParameterPrefix, colHeaders));
 23         sbCmdText.Append(")");
 24         OracleConnection connection = null;
 25         try
 26         {
 27             connection = new OracleConnection(GetConnectionString());
 28             using (OracleCommand command = connection.CreateCommand())
 29             {
 30                 command.ArrayBindCount = dataCount;
 31                 command.BindByName = true;
 32                 command.CommandType = CommandType.Text;
 33                 command.CommandText = sbCmdText.ToString();
 34                 command.CommandTimeout = 1800;
 35                 OracleParameter parameter;
 36                 OracleDbType dbType = OracleDbType.Object;
 37                 foreach (string colName in colHeaders)
 38                 {
 39                     dbType = GetOracleDbType(columnData[colName]);
 40                     parameter = new OracleParameter(colName, dbType);
 41                     parameter.Direction = ParameterDirection.Input;
 42                     parameter.OracleDbTypeEx = dbType;
 43                     parameter.Value = columnData[colName];
 44                     command.Parameters.Add(parameter);
 45                 }
 46                 connection.Open();
 47                 OracleTransaction trans = connection.BeginTransaction();
 48                 try
 49                 {
 50                     command.Transaction = trans;
 51                     result = command.ExecuteNonQuery();
 52                     trans.Commit();
 53                 }
 54                 catch (Exception ex)
 55                 {
 56                     trans.Rollback();
 57                     throw ex;
 58                 }
 59             }
 60         }
 61         finally
 62         {
 63             if (connection != null)
 64             {
 65                 connection.Close();
 66                 connection.Dispose();
 67             }
 68             GC.Collect();
 69             GC.WaitForFullGCComplete();
 70         }
 71     }
 72     return result;
 73 }

葡京正网网投 1葡京正网网投 2

  1 /// <summary>
  2 /// 根据数据类型获取OracleDbType
  3 /// </summary>
  4 /// <param name="value">数据</param>
  5 /// <returns>数据的Oracle类型</returns>
  6 private static OracleDbType GetOracleDbType(object value)
  7 {
  8     OracleDbType dataType = OracleDbType.Object;
  9     if (value is string[])
 10     {
 11         dataType = OracleDbType.Varchar2;
 12     }
 13     else if (value is DateTime[])
 14     {
 15         dataType = OracleDbType.TimeStamp;
 16     }
 17     else if (value is int[] || value is short[])
 18     {
 19         dataType = OracleDbType.Int32;
 20     }
 21     else if (value is long[])
 22     {
 23         dataType = OracleDbType.Int64;
 24     }
 25     else if (value is decimal[] || value is double[] || value is float[])
 26     {
 27         dataType = OracleDbType.Decimal;
 28     }
 29     else if (value is Guid[])
 30     {
 31         dataType = OracleDbType.Varchar2;
 32     }
 33     else if (value is bool[] || value is Boolean[])
 34     {
 35         dataType = OracleDbType.Byte;
 36     }
 37     else if (value is byte[])
 38     {
 39         dataType = OracleDbType.Blob;
 40     }
 41     else if (value is char[])
 42     {
 43         dataType = OracleDbType.Char;
 44     }
 45     return dataType;
 46 }

GetOracleDbType

说明:假诺选择分次(每便1万数额)推行 InsertBigData 方法,速度反而比三遍性试行 InsertBigData 方法慢,详见上面测验结果;

测量检验结果:

葡京网投哪个正规,无索引,数据类型:4列NVARCHAR2,2列NUMBER

30+万(7.36M):一遍性导入用时 15:623,每回10000导入用时

葡京正网网投,60+万(14.6M):二回性导入用时 28:207,每一次10000导入用时 1:2:300

100+万(24.9M):叁遍性导入报如下卓殊

葡京正网网投 3

那儿事实上从财富监视器上得以摸清依然有可用内部存款和储蓄器,然而依然报 OutOfMemoryException,所以狐疑应该是叁个 bug;

假若老是10000导入用时 2:9:252

万一每一趟50000导入用时 58:101

外加 InsertBigData 方法运用示例:

葡京正网网投 4葡京正网网投 5

  1 // 每10000数据导入一次
  2 Dictionary<string, object> columnsData = new Dictionary<string, object>();
  3 int dataCount = m_SourceDataTable.Rows.Count;
  4 int times = dataCount / 10000 + (dataCount % 10000 == 0 ? 0 : 1);
  5 for (int i = 0; i < times; i++)
  6 {
  7     int startIndex = i * 10000;
  8     int endIndex = (i + 1) * 10000;
  9     endIndex = endIndex > dataCount ? dataCount : endIndex;
 10     int currDataCount = endIndex - startIndex;
 11     columnsData.Add("COL1", new string[currDataCount]);
 12     columnsData.Add("COL2", new string[currDataCount]);
 13     columnsData.Add("COL3", new decimal[currDataCount]);
 14     columnsData.Add("COL4", new string[currDataCount]);
 15     columnsData.Add("COL5", new decimal[currDataCount]);
 16     columnsData.Add("COL6", new string[currDataCount]);
 17     for (int rowIndex = startIndex; rowIndex < endIndex; rowIndex++)
 18     {
 19         int dicRowIndex = rowIndex - startIndex;// 列数据行索引
 20         foreach (string colName in columnsData.Keys)
 21         {
 22             object cell = m_SourceDataTable.Rows[rowIndex][colName];
 23             string cellStr = (cell + "").TrimEnd(new char[] { '', ' ' });
 24             if (colName == "COL3" || colName == "COL5")
 25             {
 26                 decimal value = 0;
 27                 decimal.TryParse(cellStr, out value);
 28                 ((decimal[])columnsData[colName])[dicRowIndex] = value;
 29             }
 30             else
 31             {
 32                 ((string[])columnsData[colName])[dicRowIndex] = cellStr;
 33             }
 34         }
 35     }
 36     m_DAL.InsertBigData(columnsData, currDataCount);
 37 
 38     columnsData.Clear();
 39     GC.Collect();
 40     GC.WaitForFullGCComplete();
 41 }

View Code

梯次数据插入INSERT

数量导入的最简易方法正是编辑 INSERT 语句,将数据逐个插入数据库。这种办法只适合导入小量多少,如 SQL*Plus 脚本创造有个别表的种子数据。该办法的最大缺点就是导入速度缓慢,占用了一大波的 CPU 管理时间,不适合大量数目标导入;而其主要优点就是导入思谋轻松又有涂改康健的弹性,不需求多做其余的预备就能够利用。借令你有不菲时日没办法打发,又想折磨一下数据库和 CPU,那这种方法正切合你。

方式二:OracleBulkCopy

说明:

  1. OracleBulkCopy 选用 direct path 方式导入;

  2. 不支持 transaction,无法 Rollback;

  3. 假使该表存在触发器时,无法使用 OracleBulkCopy(报那二个音讯 Oracle Error: ORA-26086),除非先禁止使用该表的装有触发器;

  4. 进程中会自动启用 NOT NULL、UNIQUE 和 PENVISIONIMAEnclaveY KEY 二种约束,个中 NOT NULL 节制在列数组绑依期表达,任何违背 NOT NULL 限制标准的行数据都会扬弃;UNIQUE 限定是在导入完结后重新创建索引时认证,但是在 bulk copy 时,允许违反索引节制,并在成功后将引得设置成禁止使用(UNUSABLE)状态;並且,假诺索引一齐首境况正是禁止使用(UNUSABLE)状态时,OracleBulkCopy 是会报错的。

参考代码如下:

  1 /// <summary>
  2 /// 批量插入数据
  3 /// 该方法需要禁用该表所有触发器,并且插入的数据如果为空,是不会采用默认值
  4 /// </summary>
  5 /// <param name="table">数据表</param>
  6 /// <param name="targetTableName">数据库目标表名</param>
  7 /// <returns></returns>
  8 public bool InsertBulkData(DataTable table, string targetTableName)
  9 {
 10     bool result = false;
 11     string connStr = GetConnectionString();
 12     using (OracleConnection connection = new OracleConnection(connStr))
 13     {
 14         using (OracleBulkCopy bulkCopy = new OracleBulkCopy(connStr, OracleBulkCopyOptions.Default))
 15         {
 16             if (table != null && table.Rows.Count > 0)
 17             {
 18                 bulkCopy.DestinationTableName = targetTableName;
 19                 for (int i = 0; i < table.Columns.Count; i++)
 20                 {
 21                     string col = table.Columns[i].ColumnName;
 22                     bulkCopy.ColumnMappings.Add(col, col);
 23                 }
 24                 connection.Open();
 25                 bulkCopy.WriteToServer(table);
 26                 result = true;
 27             }
 28             bulkCopy.Close();
 29             bulkCopy.Dispose();
 30         }
 31     }
 32 
 33     return result;
 34 }

测量试验结果:

数据类型:4列NVARCHAR2,2列NUMBER

30+万(7.36M):用时 14:590

60+万(14.6M):用时 28:28

1048576(24.9M):用时 52:971

叠合,禁止使用表的有着外键SQL:

ALTER TABLE table_name DISABLE ALL TRIGGERS

数量导入的最简易方法便是编写 INSERT 语句,将数据逐一插入数据库。这种艺术只相符导入一点点数码,如 SQL*Plus 脚本创造有个别表的种子数据。该办法的最大弱点正是导入速度缓慢,占用了大气的 CPU 管理时间,不符合大量数据的导入;而其重要优点正是导入思量轻易又有改进完备的弹性,无需多做其余的预备就能够动用。假令你有过多时间没办法打发,又想折磨一下数据库和 CPU,那这种措施正符合你。

为了与其他方法做比较,现将十万条记下通过此形式导入到 CALLS 表中,总共消耗 172 秒,此中导入进度占用 CPU 时间为 52 秒。

总结

1、在30+万和60+万数据时,ArrayBind叁回性导入和OracleBulkCopy时间距离不是异常的大,可是ArrayBind方式经常都亟待转移数据格局,占用了一部分时辰,而 OracleBulkCopy 则只须要简单管理一下 DataTable 数据源就可以导入;

2、当数据量到达100+万时,ArrayBind 相当轻便并发内部存储器不足极度,那个时候只得利用分批次施行导入,根据测量试验结果可见,次数越少,速度越快;而采用OracleBulkCopy 情势则超级少现身内部存款和储蓄器不足现象,简单来说 OracleBulkCopy 占用内部存款和储蓄器比 ArrayBind 方式少;

3、接收 OracleBulkCopy 导入时,先要禁止使用该表全数触发器,假如该表存在自增 ID 触发器,就相比辛勤了,得先禁用改进的自增 ID 的触发器,然后手动自增设置要导入的数据,最终才足以导入;同期,这种导入格局不可并发,二个时时只好有贰个客户在导入(因为自增ID交由程序管理),那个时候还需求锁表,防止别的人还要批量导入数据;

为了与别的方法做相比较,现将十万条记下通过此方法导入到 CALLS 表中,总共消耗 172 秒,在那之中程导弹入进度占用 CPU 时间为 52 秒。

逐条数据插入 INSERT,表暂时未有索引

参照他事他说加以考查资料:

1、ArrayBind

2、ArrayBind

3、Oracle数据导入方法

4、介绍OracleBulkCopy类

5、

逐条数据插入 INSERT,表暂时未有索引

缘何上一种方法占用了超级多的 CPU 管理时间,关键是 CALLS 表中已开立了目录,当一条数据插入到表中时,Oracle 必要判断新数据与老多少在目录方面是不是有矛盾,同一时候要立异表中的富有索引,重复更新索引会消耗一定的年华。因而狠抓导入速度的好法子正是在创造表时先不创设索引大概在导入数据早先剔除全体索引,在表面文件数量逐个插入到表中后再统一创立表的目录。那样导入速度会增加,同期创制的目录也很紧凑而使得,这一法规一致适用于位图索引。对于首要的和独一的主要约束(key constraints卡塔尔国,能够使之先一时失灵(disabling卡塔尔只怕去除限制来获取一致的职能,当然这一个做法会对曾经存在的表的外键限制产生相关的影响,在剔除前须要宏观钻探。

干什么上一种格局占用了很多的 CPU 管理时间,关键是 CALLS 表中已开立了目录,当一条数据插入到表中时,Oracle 需求判断新数据与老多少在目录方面是或不是有矛盾,同临时间要更新表中的具有索引,重复更新索引会消耗一定的光阴。由此抓好导入速度的好办法正是在开立表时先不创设索引也许在导入数据在此之前删除全数索引,在外表文件数量逐一插入到表中后再统一创设表的目录。那样导入速度会巩固,同一时候创立的目录也很紧密而有效,这一规范化一致适用于位图索引。对于重大的和独一的严重性节制(key constraints卡塔尔,能够使之先一时半刻失效(disabling卡塔尔(قطر‎或许去除约束来得到同等的功效,当然那么些做法会对已经存在的表的外键限定产生相关的熏陶,在剔除前必要全面探究。

亟需证实的是,这种措施在表中已存在很相当多额的场合下不太对劲。比方表中本来就有七千万条数据,而那时候内需追加插入一千万条数据,实际导入数据节省的时间将会被再一次成立一亿条数据的目录所消耗殆尽,那是我们不期望赢得的结果。可是,借使要导入数据的表是空的或导入的数据量比本来就有个别数据量要大得多,那么导入数据节省的时光将会小量用于重新创制索引,当时该方法才得以寻思采纳。 加速索引创设是另叁个亟需思谋的难题。为了减弱索引成立中排序的办事时间,能够在近来对话中追加 SORT_AREA_SIZE 参数的分寸,该参数允许当前会话在内部存款和储蓄器的目录成立进程中进行更加多的排序操作。同样还是可以采用NOLOGGING 关键字来压缩因成立索引而变化的 REDO 日志量,NOLOGGING 关键字会对数据库的过来和 Standby 备用数据库爆发生硬的震慑,所以在动用以前要过细推敲,到底是速度优先依然牢固优先。

必要注解的是,这种办法在表中已存在重重数量的状态下不太合适。譬喻表中本来就有六千万条数据,而此刻亟待充实插入一千万条数据,实际导入数据节省的年华将会被再次创建一亿条数据的目录所花销殆尽,那是我们不指望获得的结果。但是,假设要导入数据的表是空的或导入的数据量比本来就有些数据量要大得多,那么导入数据节省的时间将会少许用以重新创造索引,这时候该情势才方可伪造使用。 加速索引创立是另一个内需考虑的难题。为了减小索引成立中排序的工时,能够在现阶段对话中追加 SORT_AREA_SIZE 参数的尺寸,该参数允许当前会话在内部存款和储蓄器的目录像造过程中推行更加多的排序操作。相像还足以选用NOLOGGING 关键字来收缩因创立索引而变化的 REDO 日志量,NOLOGGING 关键字会对数据库的过来和 Standby 备用数据库产生分明的熏陶,所以在选拔早前要多加商量,到底是速度优先依然水静无波优先。

动用这种艺术,先删除 CALLS 表的主键和不独一的目录,然后逐个导入数据,完毕后再一次成立索引( 表在导入数据前是空的卡塔尔(قطر‎。该措施总共消耗 130 秒,富含重新创立索引的时间,当中程导弹入进程占用 CPU 时间为 35秒。

应用这种方式,先删除 CALLS 表的主键和不独一的目录,然后依次导入数据,达成后再度创建索引( 表在导入数据前是空的卡塔尔国。该方法总共消耗 130 秒,包罗重新创设索引的时间,当中程导弹入进度占用 CPU 时间为 35秒。

这种情势的帮助和益处是能够加快导入的快慢并使索引特别严密有效;短处是缺点和失误通用性,当你对表扩展新的复杂的方式元素时您需求加上代码、修改导入实践顺序。此外针对 7*24 在线需要的数据库在线导入操作时,删除表的索引会对在线客户的查询有超级大的习性影响,同期也要考虑,首要或独一的第2节制标准的去除或失效或许会潜濡默化到援引它们的外键的利用。

这种艺术的亮点是足以加快导入的进度并使索引越发紧凑有效;劣点是缺乏通用性,当您对表扩大新的繁琐的情势成分时你须要增加代码、修改导入施行顺序。此外针对 7*24 在线供给的数据库在线导入操作时,删除表的索引会对在线顾客的询问有超大的质量影响,同一时候也要酌量,首要或独一的要害节制原则的删减或失效恐怕会耳闻则诵到引用它们的外键的施用。

批量铺排,表暂无索引

批量布置,表暂时未有索引

在Oracle V6 中 OCI 编制程序接口参预了数组接口个性。数组操作允许导入程序读取外界文件数量并解析后,向数据库提交SQL语句,批量布置SQL 语句检索出的数量。Oracle 仅必要施行一回 SQL 语句,然后在内部存款和储蓄器中批量深入剖判提供的数码。批量导入操作比逐行插入重复操作更有作用,那是因为只需二次拆解剖析SQL 语句,一些数码绑订操作以至程序与数据库之间往来的操作都醒目滑坡,何况数据库对每一条数据的操作都以再次可以预知的,那给数据库提供了优化实践的只怕。其优点是数码导入的完好时间分明滑坡,特别是经过占用 CPU 的岁月。

在Oracle V6 中 OCI 编制程序接口加入了数组接口特性。数组操作允许导入程序读取外界文件数量并分析后,向数据库提交SQL语句,批量安顿SQL 语句检索出的数码。Oracle 仅须求施行二遍 SQL 语句,然后在内部存款和储蓄器中批量深入深入分析提供的多少。批量导入操作比逐行插入重复操作更有效用,那是因为只需叁回深入分析SQL 语句,一些数码绑订操作以致程序与数据库之间往来的操作都生硬滑坡,并且数据库对每一条数据的操作都以重复可以知道的,那给数据库提供了优化推行的或是。其优点是数量导入的总体时间明显滑坡,极其是经过占用 CPU 的时间。

亟待提醒的是,通过 OCI 接口确实能够实践多少批量导入操作,可是过多工具和脚本语言却不扶助选取此意义。要是要使用该方法,要求斟酌您所运用的开发工具是还是不是帮衬OCI 批量操作功用。导入程序须要打开复杂的编码并或然存在不当的危机,贫乏一定的弹性。

急需提示的是,通过 OCI 接口确实能够推行多少批量导入操作,可是众多工具和脚本语言却不协理选用此功效。如果要利用该措施,需求钻探您所利用的开拓工具是不是扶植OCI 批量操作功用。导入程序供给开展复杂的编码并也许存在张冠李戴的高风险,贫乏一定的弹性。

接纳上述方式,程序将表面数据提取到内部存储器中的数组里,并实践批量布署操作,保留了表的删减/重新创建索引操作,总的导入时间下跌到14 秒,而经过占用 CPU 的时光下跌至7秒,可以知道实际导入数据所消费的年华鲜明下降了 95%。

利用上述形式,程序将表面数据提取到内部存款和储蓄器中的数组里,并实行批量插入操作,保留了表的去除/重新建设布局索引操作,总的导入时间下跌到14 秒,而经过占用 CPU 的时光下跌低到7秒,可以见到实际导入数据所花销的年华显明下落了 95%。

本文由葡京网投哪个正规发布于新葡亰-数据,转载请注明出处:探讨Oracle数据库的数据导入方法,Oracle数据库数据导入方法

关键词:

上一篇:常用命令大全,PLUS常用命令

下一篇:动手实现读写锁,java并发编程