조회 - using mysql c#




DataTable을 MySQL로 대량 복사(System.Data.SqlClient.SqlBulkCopy와 유사) (2)

성능이 좋지 않을 것이라고 생각하기 때문에 DataTable을 CSV 파일에 쓰고 MySqlBulkLoader 클래스를 사용하여 삽입을 수행하고 싶지 않습니다.

근거없는 가정에 근거하여 가능한 해결책을 배제하지 마십시오. 방금 Transaction 내부의 표준 MySqlDataAdapter#Update() 사용하여 System.Data.DataTable 에서 MySQL 테이블로 100,000 개의 행 삽입을 테스트했습니다. 실행하는 데 약 30 초가 걸렸습니다.

using (MySqlTransaction tran = conn.BeginTransaction(System.Data.IsolationLevel.Serializable))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        cmd.Connection = conn;
        cmd.Transaction = tran;
        cmd.CommandText = "SELECT * FROM testtable";
        using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
        {
            da.UpdateBatchSize = 1000;
            using (MySqlCommandBuilder cb = new MySqlCommandBuilder(da))
            {
                da.Update(rawData);
                tran.Commit();
            }
        }
    }
}

( UpdateBatchSize 대해 두 가지 다른 값을 시도했지만 경과 시간에 큰 영향을 미치지 않는 것 같습니다.)

반대로 MySqlBulkLoader 사용하는 다음 코드는 실행하는 데 5 ~ 6 초 밖에 MySqlBulkLoader .

string tempCsvFileSpec = @"C:\Users\Gord\Desktop\dump.csv";
using (StreamWriter writer = new StreamWriter(tempCsvFileSpec))
{
    Rfc4180Writer.WriteDataTable(rawData, writer, false);
}
var msbl = new MySqlBulkLoader(conn);
msbl.TableName = "testtable";
msbl.FileName = tempCsvFileSpec;
msbl.FieldTerminator = ",";
msbl.FieldQuotationCharacter = '"';
msbl.Load();
System.IO.File.Delete(tempCsvFileSpec);

... DataTable에서 100,000 행을 임시 CSV 파일 (이와 유사한 코드 사용)에 덤프하고 해당 파일에서 대량로드 한 후 파일을 삭제하는 시간을 포함합니다.

프로그램을 Microsoft SQL Server에서 MySQL로 마이그레이션하고 있습니다. 대량 복사 문제 하나를 제외하고는 모든 것이 잘 작동합니다.

MS SQL 솔루션에서 코드는 다음과 같습니다.

connection.Open();
SqlBulkCopy bulkCopy = new SqlBulkCopy(connection);
bulkCopy.DestinationTableName = "testTable";
bulkCopy.WriteToServer(rawData);

이제 MySQL과 비슷한 것을하려고합니다. 성능이 좋지 않을 것이라고 생각하기 때문에 DataTable을 CSV 파일에 MySqlBulkLoader 클래스를 사용하여 삽입을 수행하고 싶지 않습니다.

도움을 주시면 감사하겠습니다.


BulkOperation NuGet 패키지를 사용하면이 작업을 쉽게 수행 할 수 있습니다.

다음은 https://www.nuget.org/packages/Z.BulkOperations/2.14.3/ 의 패키지를 사용하는 예입니다.

using Z.BulkOperations;

......

MySqlConnection conn = DbConnection.OpenConnection();
DataTable dt = new DataTable("testtable");
MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM testtable", conn);
MySqlCommandBuilder cb = new MySqlCommandBuilder(da);
da.Fill(dt);

사용하는 대신

......
da.UpdateBatchSize = 1000;
......
da.Update(dt)

그냥 두 줄을 따라

var bulk = new BulkOperation(conn);
bulk.BulkInsert(dt);

먼저 DataTable에서 100,000 개의 행을 임시 CSV 파일로 덤프하지 않고 전체 DataTable을 MySQL로 복사하는 데 5 초 밖에 걸리지 않습니다.







database