Pourquoi SqlCommandBuilder génère des requêtes UDPATE complexes...
1 réponse
Gilles TOURREAU
Salut tout le monde !
Voilà, j'utilise un SqlCommandBuilder pour généré automatiquement les
requêtes nécessaire pour un Update() sur une DataTable...
Tout fonctionne normalement, mais le problème vient quand je suis sur
une table avec beaucoup de données (1 millions d'enregistrement a peu
près...)
Il faut attendre 10 secondes pour qu'un Update() puisse faire une
modification sur une seul colonne et pour un enregistrement...
En jettant un coup d'oeil dans le Profiler j'obtient une requête du
style :
UPDATE MaTable SET MaChampModifié = ValeurModifié WHERE Identifiant =
ValeurIdentifiant AND Colonne1 = ValeurColonne1 AND ... AND ColonneN =
ValeurColonneN
Pourquoi une telle requête est généré au niveau du WHERE alors qu'un
simple : Identifiant = ValeurIdentifiant suffirait...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Ambassadeur Kosh
> Il faut attendre 10 secondes pour qu'un Update() puisse faire une modification sur une seul colonne et pour un enregistrement... En jettant un coup d'oeil dans le Profiler j'obtient une requête du style : UPDATE MaTable SET MaChampModifié = ValeurModifié WHERE Identifiant = ValeurIdentifiant AND Colonne1 = ValeurColonne1 AND ... AND ColonneN = ValeurColonneN
Pourquoi une telle requête est généré au niveau du WHERE alors qu'un simple : Identifiant = ValeurIdentifiant suffirait...
vu que l'identifiant fait partie du where, si il est clé primaire, ça trouve la ligne instantanément dans la base. donc, les 10 secondes, ça vient pas de ça. par contre, si il est pas indexé, faut pas s'étonner.
maintenant, l'ensemble du where permet de detecter l'effet des actions d'autres utilisateurs. pour imager, vu que vous decidez des nouvelles valeurs à partir des anciennes, si elles ont bougé entre temps, il est juste de vous en informer afin que vous decidiez de ce qui doit etre fait. écraser les modifs de l'autre, ou refabriquer vos données en tenant compte des nouvelles valeurs. c'est ce qu'on appelle une transaction "optimiste". les DbTransaction ne vous seront d'aucun secours ici, puisque vous etes en mode deconnecté. ce qui explique cela.
En vous remerciant par avance de vos lumières !
j'espere que ça va vous aider un peu.
> Il faut attendre 10 secondes pour qu'un Update() puisse faire une
modification sur une seul colonne et pour un enregistrement...
En jettant un coup d'oeil dans le Profiler j'obtient une requête du style
:
UPDATE MaTable SET MaChampModifié = ValeurModifié WHERE Identifiant =
ValeurIdentifiant AND Colonne1 = ValeurColonne1 AND ... AND ColonneN =
ValeurColonneN
Pourquoi une telle requête est généré au niveau du WHERE alors qu'un
simple : Identifiant = ValeurIdentifiant suffirait...
vu que l'identifiant fait partie du where, si il est clé primaire, ça trouve
la ligne instantanément dans la base. donc, les 10 secondes, ça vient pas de
ça.
par contre, si il est pas indexé, faut pas s'étonner.
maintenant, l'ensemble du where permet de detecter l'effet des actions
d'autres utilisateurs. pour imager, vu que vous decidez des nouvelles
valeurs à partir des anciennes, si elles ont bougé entre temps, il est juste
de vous en informer afin que vous decidiez de ce qui doit etre fait. écraser
les modifs de l'autre, ou refabriquer vos données en tenant compte des
nouvelles valeurs. c'est ce qu'on appelle une transaction "optimiste". les
DbTransaction ne vous seront d'aucun secours ici, puisque vous etes en mode
deconnecté. ce qui explique cela.
> Il faut attendre 10 secondes pour qu'un Update() puisse faire une modification sur une seul colonne et pour un enregistrement... En jettant un coup d'oeil dans le Profiler j'obtient une requête du style : UPDATE MaTable SET MaChampModifié = ValeurModifié WHERE Identifiant = ValeurIdentifiant AND Colonne1 = ValeurColonne1 AND ... AND ColonneN = ValeurColonneN
Pourquoi une telle requête est généré au niveau du WHERE alors qu'un simple : Identifiant = ValeurIdentifiant suffirait...
vu que l'identifiant fait partie du where, si il est clé primaire, ça trouve la ligne instantanément dans la base. donc, les 10 secondes, ça vient pas de ça. par contre, si il est pas indexé, faut pas s'étonner.
maintenant, l'ensemble du where permet de detecter l'effet des actions d'autres utilisateurs. pour imager, vu que vous decidez des nouvelles valeurs à partir des anciennes, si elles ont bougé entre temps, il est juste de vous en informer afin que vous decidiez de ce qui doit etre fait. écraser les modifs de l'autre, ou refabriquer vos données en tenant compte des nouvelles valeurs. c'est ce qu'on appelle une transaction "optimiste". les DbTransaction ne vous seront d'aucun secours ici, puisque vous etes en mode deconnecté. ce qui explique cela.