Question

En utilisant Oracle 10g, accessible via Perl DBI, j'ai une table avec quelques dizaines de millions de lignes mises à jour plusieurs fois par seconde tout en étant lue beaucoup plus fréquemment depuis un autre processus.

Bientôt, la fréquence de mise à jour augmentera d'un ordre de grandeur (peut-être deux).Quelqu'un a suggéré que la validation de toutes les N mises à jour plutôt qu'après chaque mise à jour améliorerait les performances.

J'ai quelques questions:

  • Est-ce que cela sera plus rapide ou plus lent ou cela dépend (prévoir de comparer dans les deux sens dès que possible pour obtenir une simulation décente de la nouvelle charge)
  • Pourquoi cela va-t-il aider/entraver les performances.
  • Si "ça dépend...", de quoi ?
  • Si cela peut aider, quelle est la meilleure valeur de N ?
  • Pourquoi mon administrateur de base de données local ne peut-il pas avoir une réponse claire et utile lorsque j'en ai besoin ?
    (En fait, je connais la réponse à cette question) :-)

MODIFIER:

@codeslave :Merci, BTW perd des modifications non commises n'est pas un problème, je ne supprime pas les données originales utilisées pour la mise à jour jusqu'à ce que je suis sûr que tout va bien, BTW Cleaning Lady a débranché le serveur, deux fois :-)

Certains Google ont montré que cela pourrait être utile en raison d'un problème lié aux segments de recul, mais je ne connais toujours pas de règle générale pour n toutes les quelques dizaines?des centaines ?mille ?

@diciu :Excellentes informations, je vais certainement examiner cela.

Était-ce utile?

La solution

Une validation entraîne l'écriture d'éléments par Oracle sur le disque - c'est-à-diredans le fichier de journalisation afin que tout ce que la transaction en cours de validation a fait puisse être récupérable en cas de panne de courant, etc.L'écriture dans un fichier est plus lente que l'écriture en mémoire, donc une validation sera plus lente si elle est effectuée pour plusieurs opérations d'affilée plutôt que pour un ensemble de mises à jour fusionnées.

Dans Oracle 10g, il existe une validation asynchrone qui la rend beaucoup plus rapide mais moins fiable : https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6158695.html

PS Je sais avec certitude que, dans un scénario que j'ai vu dans une certaine application, changer le nombre de mises à jour fusionnées de 5K à 50K le rend plus rapide d'un ordre de grandeur (10 fois plus rapide).

Autres conseils

Réduire la fréquence des validations accélérera certainement les choses, mais comme vous lisez et écrivez fréquemment dans cette table, il existe un risque de verrous.Vous seul pouvez déterminer la probabilité que les mêmes données soient mises à jour en même temps.Si le risque que cela se produise est faible, validez toutes les 50 lignes et surveillez la situation.Essais et erreurs, j'en ai peur :-)

En plus de réduire la fréquence de validation, vous devriez également envisager d’effectuer des mises à jour groupées plutôt que individuelles.

Si vous « ne supprimez pas les données d'origine utilisées pour la mise à jour jusqu'à ce que vous soyez sûr que tout va bien », alors pourquoi ne supprimez-vous pas toutes ces validations incrémentielles entre les deux et ne les annulez-vous pas en cas de problème ?Il semble que vous ayez effectivement construit un système de transactions au-dessus des transactions.

@CodeSlave répond à vos questions par @stevechol, si je supprime TOUS les commits incrémentiels, il y aura des verrous.Je suppose que si rien de mieux ne se présente, je suivrai ses conseils, choisirai un nombre aléatoire, surveillerai la charge et ajusterai en conséquence.Lors de l'application de @diciu twaks.

PS :la transaction en plus de la transaction est juste accidentelle, je récupère les fichiers utilisés pour les mises à jour par FTP et au lieu de les supprimer immédiatement, je définis une tâche cron pour les supprimer une semaine plus tard (si personne n'utilisant l'application ne s'est plaint), cela signifie que si quelque chose ça tourne mal, j'ai une semaine pour détecter les erreurs.

Plus rapide/plus lent ?

Ce sera probablement un peu plus rapide.Cependant, vous courez un plus grand risque de vous retrouver dans des blocages, de perdre les modifications non validées en cas de catastrophe (la femme de ménage débranche le serveur), FUD, Fire, Brimstone, etc.

Pourquoi cela aiderait-il ?

Évidemment, moins d’opérations de validation, ce qui signifie moins d’écritures sur disque, etc.

Des DBA et des réponses claires ?

Si c'était facile, vous n'en aurez pas besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top