2010-03-18 2 views
1

VB에서 가져 오기를 했어. 마녀는 SQLServer에서 데이터를 가져 와서이 데이터를 원격 MySQL 서버에 ADSL 연결을 통해 삽입합니다.삽입 최적화

처음으로 200 레코드와 같았지만 지금은 500.000 개가 넘는 레코드가 있으며 11 시간 동안 모든 데이터를 내보내는 데 시간이 오래 걸리며 매우 좋지 않습니다.

나는 수입업자를 최적화해야한다. 마녀는 이제 데이터 테이블에 데이터를 가져온다. 나는 루프 (행에 열)가있는 마녀가 "삽입"쿼리를 사용하여 데이터를 삽입한다. :

  For Each dr As DataRow In dt.Rows 
      Console.Write(".") 

      Dim sql As String = "INSERT INTO clientes(id,nombrefis,nombrecom,direccion,codpos,municipio_id,telefono,fax,cif)" & _ 
         "VALUES (@id,@nombrefis,@nombrecom,@direccion,@codpos,@municipio_id,@telefono,@fax,@cif)" 
      cmd = New MySqlCommand(sql, cnn) 
      cmd.Parameters.AddWithValue("id", Int32.Parse(dr("ID EMPRESA").ToString)) 
      cmd.Parameters.AddWithValue("nombrefis", dr("NOMEMP")) 
      cmd.Parameters.AddWithValue("nombrecom", dr("EMPRESA")) 
      cmd.Parameters.AddWithValue("direccion", dr("DIRECC")) 
      cmd.Parameters.AddWithValue("codpos", dr("CODPOS")) 
      cmd.Parameters.AddWithValue("municipio_id", Int32.Parse(dr("CODIGO MUNICIPIO")).ToString) 
      cmd.Parameters.AddWithValue("telefono", dr("TELEF")) 
      cmd.Parameters.AddWithValue("fax", dr("FAX")) 
      cmd.Parameters.AddWithValue("cif", dr("CIF")) 
      cmd.ExecuteNonQuery() 
     Next 

어떤 아이디어 나 조언이 있습니까? 덕분에 너무 많은

답변

3
  1. 명령을 생성 매개 변수를 추가하고 루프 전에 명령 (Prepare 방법)을 준비합니다. 그래서 ... 난 그냥 당신이 MySQL을 사용하고 실현 : 그런 다음 루프에서 매개 변수 값을 설정하고
  2. 1000의 배치에 의해, 거래의 명령을 실행 명령을 실행 정도

EDIT 명령 InnoDB 테이블을 사용하지 않는다면 트랜잭션을 사용할 수 없다. 어쨌든, 내 명령을 한 번만 쓸 수 있도록 첫 번째 조언을 쓸 수 있습니다.

+0

ey! 답변 해 주셔서 감사합니다. 하지만 준비 방법은 더 빨리 내 응용 프로그램이 될 것입니까? 예 ... 내 테이블 유형이 MyISAM이지만 내 응용 프로그램이 더 빨리 표시되도록 변경할 수 있습니다. 어쨌든 감사합니다. – ikerib

+0

예. 미리 진술을 준비하면 성능이 향상 될 수 있습니다 (최소한 약간). 나는 거래에 대해 그렇게 확신하지는 않는다. –