Question

J'ai un gros travail d'insertion pour effectuer, par exemple inserts 300000.

Si je fais le chemin de l'héritage, je viens d'écrire une chaîne SQL avec des blocs de 100 déclarations Insertion, et une ExecuteCommand contre exécutée de la DB (chaque 100 enregistrements).

Cela donne à quelque 100 inserts par 3 secondes.

Maintenant, bien sûr, il y a problème avec des guillemets simples et CrLf est dans les valeurs insérées. Ainsi, plutôt que d'écrire du code pour doubler les guillemets simples et ainsi de suite, parce que je suis paresseux, j'ai un aller avec Linq InsertOnSubmit et une context.SublitChanges l'autre 100 lignes.

Et prendre quelques 20x fois plus que le chemin de l'héritage !!!

Pourquoi?

Était-ce utile?

La solution

Vous n'êtes pas utiliser le bon outil pour le travail. LINQ to SQL et la plupart des autres ORM (au moins Entity Framework et NHibernate) sont destinés à des scénarios OLTP, ils ne sont pas destinés à des opérations de données en vrac et exécuteront lentement lorsqu'il est utilisé pour les opérations de données en vrac.

Vous devez utiliser SqlBulkCopy .

Autres conseils

J'ai eu les mêmes problèmes, avec InsertOnSubmit() prendre beaucoup de temps.

Cependant, en utilisant la classe DataTableHelper (téléchargeable à partir du lien ci-dessous), et en changeant seulement 1 ou 2 lignes de votre code, vous pouvez facilement utiliser une insertion en bloc à la place.

bloc-inserts

Par exemple:

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);
}

Hope this helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top