2013-03-18 2 views
-1

Итак, что я делаю, это чтение большого количества данных из удаленной базы данных Nettezza и вставка их в другую удаленную базу данных Oracle. Для этого я использую драйвер ODBC. Проблема в том, что имеется много данных, и требуется слишком много времени. Как я могу ускориться? Вот что я делаю:Как ускорить вставку odbc

Сначала я создаю подключение и команду для вставки:

String connect = "Driver={Microsoft ODBC for Oracle};CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=myprt))(CONNECT_DATA=(SERVICE_NAME=myname)));Uid=uid;Pwd=pass"; 
     connection = new OdbcConnection(connect); 
     connection.Open(); 
     String q = @"INSERT INTO TEST (id) 
     VALUES (?)"; 
     myCommand = new OdbcCommand(q,connection); 

Затем я прочитал данные из netteza:

String connect = "Driver={NetezzaSQL};servername=server;port=5480;database=db; username=user;password=pass; 
     string query = @"SELECT T2.LETO_MESEC, T1.* 
         FROM data T1 
         JOIN datga2 T2 ON T2.ID = T1.EFT_ID 
         WHERE T2.LETO_MESEC = '" + mesec + @"'"; 
      using (OdbcConnection connection = new OdbcConnection(connect)) 
      { 
       try 
       { 
        OdbcCommand command = new OdbcCommand(query, connection); 
        connection.Open(); 
        OdbcDataReader reader = command.ExecuteReader(); 
        int counter=0; 
        while (reader.Read()) 
        { 
         int id_first = reader.GetInt32(5); 

         insertOracle(id_first); 
        } 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("ne dela" + e.ToString()); 
       } 
      } 

И, наконец, моя вставка:

public void insertOracle(int id_first) 
    { 

      try 
      { 
       myCommand.Parameters.Clear(); 
       myCommand.Parameters.Add(new OdbcParameter("id", id_first)); 
       myCommand.ExecuteNonQuery(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("ne dela" + e.ToString()); 
      } 

    } 

Я заметил, что они фиксируются в каждой строке, поэтому, как удалить это и ускорить его. Сейчас это занимает около 10 минут для 20000 строк.

+1

Вместо выполнения каждого запроса на вставку отдельно вы можете создать партию вставленных запросов, например (100) * (разделенных символом ';') *, а затем вставить их с помощью одного 'ExectuteNonQuery', вы можете сохранить все если вы хотите. – Habib

+0

+1 для 'BEGIN TRANSACTION', [сделайте свои вставки],' COMMIT TRANSACTION' –

+0

Может кто-нибудь, пожалуйста, разместите пример о том, как это сделать ??? – gabrjan

ответ

2

Одиночные вставки всегда будут медленными - начните обработку данных в массивах, выбирая партию идентификаторов из исходной системы и загружая массив в цель.

Вот статья, которая может быть полезна. http://www.oracle.com/technetwork/issue-archive/2009/09-sep/o59odpnet-085168.html

Смежные вопросы