`

数组接口(批量插入)研究

阅读更多

数组接口

    数组接口允许你使用数组变量替代标量变量来进行绑定。当特定的DML语句需要插入或更新大量数据的时候,它就会非常有用。在执行DML语句的时候,不再需要针对每条记录分别执行一次,而可以将所有必要的值组合进一个数组然后仅仅需要执行一次即可,如果纪录的数量太大,也可以将执行操作拆分成小一点的批次。结果,到数据库的往返次数将与执行次数的数量成比例地下降。

必须强调的是,没有应用批量处理时加载的低性能并不是数据库引擎导致的,而是应用程序本身导致并反过来又受其拖累。

尽管数组接口对客户端来讲更加有效,数据库也能从中收益,事实上,数组接口降低了逻辑读的数量。

 

下面将提供一些关于如何在PL/SQLOCIJDBCODP.NET中使用数组接口的基本信息。

1.PL/SQL

 PL/SQL中,可以使用FORALL语句来应用数组接口。在执行一个DML语句的时候,可以利用它来将数据绑定成数组传递给数据库引擎。示例代码如下:

 

DECLARE

  TYPE t_id IS TABLE OF t.id%TYPE;

  TYPE t_pad IS TABLE OF t.pad%TYPE;

  l_id t_id := t_id();

  l_pad t_pad := t_pad();

BEGIN

  -- prepare data

  l_id.extend(100000);

  l_pad.extend(100000);

  FOR i IN 1..100000

  LOOP

    l_id(i) := i;

    l_pad(i) := rpad('*',100,'*');

  END LOOP;

  -- insert data

  FORALL i IN l_id.FIRST..l_id.LAST

    INSERT INTO t VALUES (l_id(i), l_pad(i));

END;

 

需要特别注意的是,尽管这个语法是基于关键字FORALL的,但这不是一个循环。所有的纪录都是在一次数据库调用中发送过去的。 

2.JDBC

JDBC中,可以使用批量更新来使用数组接口(在一次执行操作中插入10万条记录)。例如代码如下:

 

sql = "INSERT INTO t VALUES (?, ?)";

statement = connection.prepareStatement(sql);

for (int i=1 ; i<=100000 ; i++)

{

     statement.setInt(1, i);

     statement.setString(2, "****************************************************************************************************");

     statement.addBatch();

 }

 statement.executeBatch();

 statement.close();

3.ODP.NET

ODP.NET中,只要定义好基于数组的参数,并将属性ArrayBindCount设置为存储在数组中的值的个数,就可以应用数组接口了。下面的代码片段展示了这一点,它在一次执行操作中插入了10万条记录。

 

            Decimal[] idValues = new Decimal[100000];

            String[] padValues = new String[100000];

 

            for (int i=0 ; i<100000 ; i++)

            {

                idValues[i] = i;

                padValues[i] = "******************************************************************************************";

            }

 

            id = new OracleParameter();

            id.OracleDbType = OracleDbType.Decimal;

            id.Value = idValues;

 

            pad = new OracleParameter();

            pad.OracleDbType = OracleDbType.Varchar2;

            pad.Value = padValues;

 

            sql = "INSERT INTO t VALUES (:id, :pad)";

            command = new OracleCommand(sql, connection);

            command.ArrayBindCount = 100000;

            command.Parameters.Add(id);

            command.Parameters.Add(pad);

            command.ExecuteNonQuery();

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics