2010-06-09 4 views
0

Nous avons une table appelée table de travail qui a des colonnes (key (clé primaire), ptime, aname, status, content).optimisation DB pour l'utiliser comme une file d'attente

Nous avons quelque chose appelé producteur qui met en lignes dans cette table et nous avons un consommateur qui fait une commande par la colonne key et récupère la première ligne qui a le statut 'en attente'. Le consommateur fait un peu de traitement sur cette ligne:

    état
  1. des mises à jour de « traitement »
  2. fait un peu de traitement en utilisant le contenu
  3. supprime la ligne

Nous sommes confrontés à des problèmes de contention lorsque nous essayons de exécuter plusieurs consommateurs (probablement en raison de l'ordre - par lequel effectue une analyse de table complète). L'utilisation de files d'attente avancées serait notre prochaine étape mais avant d'y aller, nous voulons vérifier quel est le débit maximum que nous pouvons atteindre avec plusieurs consommateurs et producteurs sur la table. Quelles sont les optimisations que nous pouvons faire pour obtenir les meilleurs nombres possibles?

Pouvons-nous faire un traitement en mémoire où un consommateur extrait 1000 lignes à la fois traite et supprime? Est-ce que cela va améliorer? Quelles sont les autres possibilités? partitionnement de la table? parallélisation? Indexer les tables organisées? ...

Répondre

1

Les optimisations possibles dépendent beaucoup de la base de données utilisée, mais une approche assez générale serait de créer un index qui couvre tous les champs nécessaires pour sélectionner les lignes correctes (il semble que ce serait la clé et le status dans ce cas). Si l'index est créé correctement (certaines bases de données ont besoin de l'ordre correct des éléments clés, d'autres non), la requête devrait être beaucoup plus rapide.