2009-08-19 4 views
2

J'ai une table (plusieurs actuellement) qui contient beaucoup de colonnes (peut-être 100+). Quoi de mieux en termes de performances lors de la mise à jour des lignes de la table, si seulement quelques colonnes ont été modifiées.Mise à jour des lignes dans un tableau avec plusieurs colonnes

  1. Pour générer l'instruction UPDATE dynamiquement uniquement mettre à jour les colonnes modifiées.
  2. Pour créer une instruction UPDATE paramétrée contenant toutes les colonnes, y compris celles qui n'ont pas été modifiées.
  3. Pour créer une procédure qui prend toutes les valeurs en tant que paramètres et met à jour la ligne.

J'utilise SQL Server. Il n'y a pas de BLOBS dans la table.

Merci/M

+0

Quel type de données stockez-vous dans une table contenant plus de 100 colonnes? –

+0

En fait je n'ai pas compté combien de colonnes il y a, mais il y en a beaucoup. Le modèle de données est bon, c'est juste que l'entité que la table représente a beaucoup de propriétés. –

Répondre

1

Les options 2 et 3 nécessitent plus de données transmises au serveur lors d'une mise à jour - et ont donc un surcoût de communication plus important pour les données uniquement.

Chaque ligne possède-t-elle un ensemble différent de colonnes mises à jour ou l'ensemble de colonnes est-il mis à jour de la même manière pour un cycle donné (mais la liste peut varier d'une instance à l'autre)?

Dans ce dernier cas (même ensemble de colonnes mis à jour sur un cycle donné), l'option 1 est susceptible de mieux fonctionner; la déclaration sera préparée une fois et utilisée plusieurs fois avec un minimum de données transférées au serveur pour chaque mise à jour. Dans le premier cas, je chercherais à voir s'il y a un sous-ensemble relativement petit des colonnes qui sont changées (disons 10 colonnes qui sont changées dans des rangées différentes, même si une rangée seulement change jusqu'à 3 de ces colonnes dix). Dans ce cas, je paramétrerais probablement pour les 10 colonnes, en acceptant le surcoût relativement faible de transmission des valeurs de colonne 7-9 qui n'ont pas changé pour la commodité d'une seule instruction préparée. Si l'ensemble des colonnes mises à jour est partout sur la carte (disons que plus de 50 des 100 colonnes sont mises à jour sur l'ensemble de l'opération), il est probablement plus simple de traiter tout le lot. Dans une certaine mesure, cela dépend de la facilité avec laquelle votre langage hôte (API client) gère les différentes possibilités de paramétrage des mises à jour.

4

Je dirais que le numéro 2 et 3 sont équivalentes du point de vue de la performance. Si vous utilisez un PK pour déterminer quelle ligne mettre à jour et s'il s'agit d'une clé en cluster, je ne me soucierais pas de mettre à jour une colonne. Le problème avec la 1ère situation est que vous allez provoquer une procédure "cache cache", où vous avez beaucoup de plans similaires qui occupent tous votre cache de plan parce qu'ils sont une itération légèrement différente de la mise à jour.

Si vous envisagez de faire des mises à jour massives, je pourrais hésiter à recommander la mise à jour toutes les colonnes, car il peut provoquer FK look-ups, etc.

Merci, Eric

+0

La mise à jour provoquera-t-elle une recherche FK même si la valeur du FK ne change pas? –

+0

Je pense que ce ne sera pas si vous définissez une colonne à elle-même, mais je ne suis pas sûr. Laissez-moi vérifier et revenir à vous. – Anon246

+1

Il semble que les recherches se produisent même si vous mettez à jour à la même valeur. En tant que tel, faire une grande quantité de mises à jour sur une table avec des FK pointant vers d'autres tables peut provoquer des balayages ou rechercher les autres tables. (Aussi une bonne raison de vous assurer que tous vos combos PK/FK sont indexés). – Anon246

0

Je voterais pour p .1 mélangé avec p.2, c.-à-d. Construire dynamiquement une instruction UPDATE paramétrée qui ne mettra à jour que les colonnes modifiées. Cela fonctionnera dans le cas où votre taux de lecture/écriture est du côté «lu» et que vous n'effectuez pas les mises à jour trop fréquemment afin que nous puissions échanger la mise en cache du plan de requête pour les performances de mise à jour (physique).

Questions connexes