2011-09-29 4 views
0

J'ai un grand nombre de lignes dans une table SQL Server. Je dois sélectionner toutes ces lignes et exécuter une requête de mise à jour pour chacune de ces lignes. Je dois savoir ce qui est la meilleure option faire une des options suivantesMise à jour d'un grand nombre de lignes

  1. exécuter une requête de sélection et obtenir un DataTable et utiliser le code suivant dans l'application

    foreach (article DataRow dans DataTable.Rows) {// effectuer la mise à jour }

  2. au niveau de la base de données utiliser une procédure stockée, sélectionnez l'ensemble de données et utiliser le curseur SQL Server pour effectuer la mise à jour

+4

Pourquoi avez-vous besoin de faire la mise à jour une ligne à la fois? Une solution basée sur un ensemble est probablement beaucoup plus efficace. –

+1

Comment changez-vous les données? Ces deux options pourraient être assez lentes. Mais il y a de meilleures options en fonction des changements. –

+2

Utilisez ** option 3 **: une instruction UPDATE ** basée sur un ensemble ** dans SQL. Il n'y a absolument pas besoin de mettre les données à la disposition du client pour une mise à jour (option 1), et lors de la mise à jour sur le serveur, il faut ** éviter le curseur ** - c'est lent, c'est moche, pas nécessaire dans 99% des cas les cas de toute façon ... aussi: de combien de lignes parlez-vous? Des centaines? Milliers? Des millions? –

Répondre

2

L'option 1 par rapport à l'option 2 signifie que vous travaillez avec un jeu de données déconnecté par rapport aux lecteurs de données connectés. Comme cela a déjà été mentionné ici dans SO, cela signifie plus de mémoire à la fois sur le client par rapport à une connexion maintenue plus longtemps et plus petite partie de données transmises plus souvent en boucle sur les résultats. Puisque votre objectif principal est la mise à jour des données, je pense que les deux options sont probablement similaires et si vous avez beaucoup d'enregistrements, j'irais probablement pour le second, en utilisant datareader, pour ne pas avoir à charger tous ces enregistrements à la fois.

Comme d'autres l'ont déjà souligné, les meilleures performances seraient obtenues avec une procédure stockée de mise à jour basée sur un ensemble à laquelle vous passeriez certains paramètres et tous les enregistrements seraient mis à jour atomiquement à la fois. Ou aussi jeter un oeil aux mises à jour de SqlBulk.

0

i ont aussi une suggestion

foreach(DataRow item in DataTable.Rows) { 
    //perform update 
} 

ici vous pouvez utiliser LINQ .so il peut donner une réponse rapide

0

Comme Marc déjà commenté, optez pour l'option 3, et faire une série mise à jour sur la base si au tout possible (et habituellement c'est). Si vous pensez que ce n'est pas le cas, vous pourriez peut-être poser une question distincte sur la façon de procéder. Plus vous donnerez de détails, meilleures seront les solutions proposées.

Questions connexes