質問

私は300000件のインサートを実行するために大きな挿入の仕事をしています。

レガシーの方法でそれを行うと、100個の挿入ステートメントのブロックを含むSQL文字列を書き、DBに対してexecuteCommandを実行します(各100レコード)。

これは、3秒ほどあたり約100個のインサートに役立ちます。

もちろん、挿入された値内に単一の引用とCRLFに問題があります。したがって、コードを書くために単一の引用符などを2倍にするのではなく、怠けているので、Linq InsertOnsubmitと1つのContext.sublityangを使用して100列をご覧ください。

そして、それはレガシーの方法よりも20倍以上かかります!!!

なんで?

役に立ちましたか?

解決

仕事に適したツールを使用していません。 LINQ-to-SQLおよび他のほとんどのORM(少なくともエンティティフレームワークとNhibernate)は、OLTPシナリオを対象としており、バルクデータ操作を目的としておらず、バルクデータ操作に使用するとゆっくりと機能します。

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

他のヒント

同じ問題がありました 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);
}

お役に立てれば。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top