どのようにして、バッチ処理を実行しますか?

batch-file bulk dapper orm

質問

私はプロジェクトでdapper ormを持っており、データベースにはデータ(1200000row)を保存していますが、dapperとのトランザクションでは非常に遅いですが、fast.with nhibernate(session statetless)は遅いです。私はdapperが速いと思うのは、9秒でdapperで33秒でnhibernateを持つデータ(700000)を取得するからです。

どのように問題を解決?

私のコードは:

IDbTransaction trans = connection.BeginTransaction();
connection.Execute(@"
    insert DailyResult(Id, PersonId,DateTaradod,DailyTaradods)
    values(@Id, @PersonId,@DateTaradod,@DailyTaradods)", entity, trans);                                    
trans.Commit();

エキスパート回答

任意の正規ADO.NET APIを介して、トランザクション瞬時に1200000行を挿入するようにするメカニズムはありません。それは単にそのAPIの意図が何であるかというだけではありません

SqlBulkCopyを使用する必要があるように思っています。これはトランザクションをサポートし、 FastMemberを使用してここで支援することができます。例えば:

IEnumerable<YourEntity> source = ...
using(var bcp = new SqlBulkCopy(
    connection, SqlBulkCopyOptions.UseInternalTransaction))
using(var reader = ObjectReader.Create(source,
         "Id", "PersonId", "DateTaradod", "DailyTaradods"))
{
    bcp.DestinationTableName = "DailyResult";
    bcp.WriteToServer(reader);
}

また、 外部トランザクションもサポートしていますが、「tran、push、tranを作成する」場合は、内部トランザクションを使用することもできます。

SqlBulkCopyを使用したくない場合は、テーブル値パラメータアプローチを参照することもできますが、このボリュームを処理する場合はSqlBulkCopyが私の推奨する APIになります。

注意:表には、より多くの列がある場合はIdPersonIdDateTaradodDailyTaradods 、あなたが明示的に指定することができbcp.ColumnMappings挿入の動作を微調整します。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow