LEGACYSQL INSERTステートメントと比較して、linq insertonSubmit
-
25-10-2019 - |
質問
私は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);
}
お役に立てれば。
所属していません StackOverflow