2

300000 回の挿入など、実行する大きな挿入ジョブがあります。

従来の方法で行う場合、100 個の Insert ステートメントのブロックで SQL 文字列を記述し、DB に対して executeCommand を実行します (100 レコードごと)。

これは、3 秒あたり約 100 回の挿入に役立ちます。

もちろん、挿入された値内の一重引用符と CrLf には問題があります。私は怠け者なので、一重引用符を二重にするコードを書くのではなく、Linq InsertOnSubmit と 1 つの context.SublitChanges を 100 行ずつ使用します。

そして、それは従来の方法よりも約20倍かかります!!!

なんで?

4

2 に答える 2

4

仕事に適したツールを使用していません。LINQ-to-SQLおよびその他のほとんどのORM(少なくともEntity FrameworkおよびNHibernate)はOLTPシナリオを対象としており、バルクデータ操作を対象としておらず、バルクデータ操作に使用するとパフォーマンスが低下します。

を使用する必要がありますSqlBulkCopy

于 2011-01-27T14:12:38.860 に答える
2

InsertOnSubmit()長い時間がかかるという同じ問題がありました。

ただし、DataTableHelperクラス (以下のリンクからダウンロード可能) を使用し、コードの 1 ~ 2 行を変更するだけで、代わりに一括挿入を簡単に使用できます。

一括挿入

例えば:

const int RECORDS_TO_INSERT = 5000;

List<Product> recordsToBeInserted = new List<Product>();
using (NorthwindDataContext dc = new NorthwindDataContext())
{
    for (int n = 0; n < RECORDS_TO_INSERT; n++)
    {
        Product newProduct = new Product()
        {
            ProductName = "Product " + n.ToString(),
            UnitPrice = 3999,
            UnitsInStock = 2,
            UnitsOnOrder = 0,
            Discontinued = false
        };
        recordsToBeInserted.Add(newProduct);
    }
    // Insert this List<> of records into the [Products] table in our database, using a Bulk Insert
    DataTableHelper.BulkCopyToDatabase(recordsToBeInserted, "Products", dc);
}

お役に立てれば。

于 2015-07-01T10:33:43.477 に答える