2010-12-09 4 views
2

La situation se présente comme suit:transaction SQL affectant une grande quantité de lignes

Un grand système client de production/serveur où la table d'une base de données centrale a une certaine colonne qui a eu NULL comme valeur par défaut, mais a maintenant 0 par défaut valeur. Mais toutes les lignes créées avant ce changement de cours ont toujours une valeur nulle et cela génère beaucoup de messages d'erreur inutiles dans ce système.

solution est évidemment plus simple:

update theTable set theColumn = 0 where theColumn is null 

Mais je suppose que ça va prendre beaucoup de temps pour effectuer cette transaction? En dehors de cela, y aura-t-il d'autres problèmes auxquels je devrais penser avant de faire cela? Cette grosse transaction va-t-elle bloquer toute la base de données, ou cette table particulière, pendant tout le processus de mise à jour?

Cette table particulière a environ 550k lignes et 500k d'entre eux a une valeur nulle et sera affectée par l'instruction sql ci-dessus.

+0

Autre point: Exécutez cette mise à jour "after hours", c'est-à-dire lorsque la base de données est la moins active. –

+0

550k lignes n'est rien. La «grande quantité de lignes» commence quelque part autour de 100M. –

Répondre

2

L'impact sur les performances des autres clients connectés dépend:

  • Quelle est la vitesse du matériel des serveurs est
  • nombre d'index contenant la colonne de votre déclaration de mise à jour doit mettre à jour
  • Quels paramètres d'isolation de transaction les autres clients se connectent à la base de données

Le moteur db va acquérir des verrous d'écriture, donc lorsque vos clients n'ont besoin que d'un accès en lecture à l'onglet le, ça ne devrait pas être un gros problème. 50000 enregistrements ne sonne pas trop pour moi, mais comme je l'ai dit, le temps et les ressources que la mise à jour prend dépend de nombreux facteurs.

Avez-vous un système de test similaire, où vous pouvez essayer la mise à jour?

Une autre solution consiste à diviser la grande mise à jour en plusieurs petites et les appeler en boucle.

Lorsque vous écrivez fréquemment des clients dans cette table, votre instruction de mise à jour peut être bloquée "pour toujours". J'ai vu des bases de données où effectuer la mise à jour ligne par ligne était le seul moyen d'obtenir la mise à jour. Mais c'était une table avec environ 200.000.000 dossiers et environ 500 très clients actifs!

+0

D'accord, une requête simple ne devrait pas prendre autant de temps à s'exécuter, même sur une base de données massive. Je suggère également d'exécuter cette requête à un moment où peu de personnes utilisent la base de données autant que possible, juste pour garder les choses un peu plus pratique pour vos utilisateurs. – guildsbounty

1

ça va prendre beaucoup de temps pour effectuer cette transaction

il n'y a pas de façon définitive de dire cela. Cela dépend beaucoup du matériel, du nombre de sessions simultanées, si la table a des verrous, du nombre de déclencheurs interdépendants et al.

Est-ce que cette grande transaction de bloc la base de données entière ou cette table particulière au cours du processus de mise à jour

Si la « base de données tout » dépend de ce tableau alors il pourrait.

qu'il y aura d'autres questions je penser avant de faire ce

Si la table a été verrouillé par une autre transaction - vous pouvez exécuter dans une situation de verrouillage de la ligne. Dans de rares cas, peut-être une situation de verrouillage mort. Le mieux serait de s'assurer que personne n'utilise la table, vérifier les verrous pré-existants et ensuite exécuter la déclaration.

0

Les problèmes de verrouillage sont spécifiques au fournisseur.

Sans aucun déclencheur sur la table, un demi-million de lignes n'est pas très utile pour un serveur de base de données intermédiaire, même avec de nombreux index sur la table.

Questions connexes