3

プロジェクトに dapper orm があり、データベースにデータ (1200000row) の alto を保存していますが、dapper とのトランザクションが非常に遅いです。nhibernate で 33 秒、dapper で 9 秒でデータ (700000) をフェッチするので、dapper は速いと思います。

どのように問題を解決しましたか?

私のコードは:

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

1 に答える 1

5

通常の 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);
}

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

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

Id注: テーブルに、PersonIdDateTaradodおよびよりも多くの列がある場合は、DailyTaradods明示的に指定bcp.ColumnMappingsして、挿入の動作を微調整できます。

于 2013-07-02T10:17:01.557 に答える