2010-08-13 8 views
0

Je tente de mettre à jour environ 150 000 enregistrements dans une table dans SQL 2005 en utilisant linq2sql. Quand il s'agit de xx.SubmitChanges(), cela prend environ 45 minutes. J'utilise SQL en tant qu'instance locale sur un PC quadricœur.Comment optimiser LinqToSQL dans C#

Est-ce que quelqu'un sait pourquoi cela prend si longtemps? ou est-ce normal?

Exemple de code:

var y = db.x.Where(j => j.NumberOfOrders > 0).Select(k => k); 

foreach (var item in y) 
{ 
    try 
    { 
     item.k = "bla"; 
    } 
    catch (Exception ex) 
    { 
     // 
    } 
} 

db.SubmitChanges(); 

Répondre

5

cela prendra beaucoup de temps il n'y a pas d'insertion en vrac dans LINQ pour sql.In ce cas, il insère un par un enregistrement à votre contexte et enfin son va et enregistrer dans votre base de données lorsque vous appelez SubmitChanges(). Cela prend donc du temps.

Si vous avez un grand record comme 150 000 enregistrements. Mieux vaut utiliser Bulk insert en sql. Cela prendra seulement une fraction de seconde seulement pour insérer.

+0

L'opération dans la question n'est pas une insertion, c'est une mise à jour. – umbyersw

2

Vous n'avez pas besoin Select() car il projette la même chose que le cas()

Et il n'y a pas besoin d'utiliser try-catch pour un simple assigment.

Mais sans aucun doute la meilleure chose à faire est le bloc d'insertion Stuff qui anishmarokey parle

+0

hey @Carlos, il y a en fait un peu plus de choses dans le bloc que j'ai besoin de faire attention mais n'était pas nécessaire pour l'échantillon de code, c'est pourquoi c'est là. Mais merci pour l'astuce .Select(). Je vérifierai. Et la copie en bloc aussi bien. – Grant

1

Une grande mise à jour, comme cela se fait avec une requête UPDATE (ou procédure stockée) qui peut utiliser la base de données pour faire le levage lourd (et la gestion des transactions/cohérence). Je sais que vous simplifiez l'exemple, mais qu'en est-il quelque chose comme ceci:

string CommandText = "UPDATE x SET k = @k WHERE NumberOfOrders > 0"; 
using (SqlConnection conn = new SqlConnection(My.Settings.DatabaseConnection)) { 
    using (SqlCommand cmd = new SqlCommand(CommandText, conn)) { 
     cmd.Parameters.AddWithValue("@k", "bla"); 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
} 
+0

Je ne sais pas si cela fonctionnerait car @k sera différent pour chaque enregistrement. Je pense que devra faire un insert en vrac ...? – Grant

+0

@Grant, malheureusement, vous n'insérez pas de nouveaux enregistrements, vous mettez à jour ceux existants ... Il y a * beaucoup * de solutions à l'intérieur de la base de données pour résoudre toutes sortes de problèmes de manipulation de données. – umbyersw

+0

vous auriez pu utiliser la méthode sur DataContext db.ExecuteCommand (UPDATE x SET k = {0} WHERE NumberOfOrders> 0, "bla") – Kikaimaru