2017-05-28 2 views
0

Nous utilisons une table pour une file d'attente de messagerie. Lorsque de nouveaux messages doivent être envoyés, ils sont insérés dans cette table. Il y a un champ dans la table appelé status avec un index dessus. Un script s'exécute toutes les 10 secondes et vérifie s'il y a un nouveau courrier avec le statut = 0, envoie ce courrier puis met à jour le statut à 1 (le contenu du courrier est sauvegardé en tant que colonne nvarchar(max)). Ma question: y a-t-il un avantage à nettoyer immédiatement la table, c'est-à-dire qu'une fois qu'un email est envoyé, copiez l'enregistrement dans une autre table "envoyée" et supprimez-le de la table des files d'attente? À l'heure actuelle, nous effectuons ce processus de nettoyage seulement une fois par mois, supprimant environ 500 000 courriels chaque mois.optimisation de la file d'attente SQL Server par suppression immédiate

Répondre

1

Vous devez considérer la performance de quelques opérations ici:

  • sélectionne des e-mails envoyés
  • inserts de nouveaux e-mails
  • mises à jour des e-mails envoyés
  • de suppressions des e-mails envoyés

Pour résoudre le problème de suppression immédiatement: si vous ne rencontrez aucun problème d'espace disque, le moyen le plus rapide de supprimer le les données doivent tronquer toute la table, par ex. une fois par mois.

performance Insérer ne devrait pas être affectée par le choix de différentes approches - temps d'inserts dépend plus de la disponibilité de la table (en parlant de serrures) et de la structure physique, que sur la taille de la table. Donc, quand il s'agit de verrouillage, il serait préférable de ne pas nettoyer les lignes tout de suite (en regardant juste les inserts en ce moment).

mises à jour du drapeau « envoyé » est la partie la plus délicate ici. La taille de la table joue un grand rôle, car vous devez d'abord sélectionner les lignes avec de nouveaux e-mails, puis mettre à jour la ligne une fois que vous l'avez réellement envoyée. Je suppose que vous utilisez un curseur pour envoyer un e-mails par un dans une boucle, donc tout ce dont vous avez besoin est juste une instruction select pour trouver ID de tous les éléments à envoyer. Cela ne devrait pas être consommateur de ressources si vous avez un index non clusterisé sur la colonne des indicateurs. Vous devez vous rappeler de maintenir l'index cependant, mais cela peut être pris en charge en dehors des heures de bureau. Une fois que vous avez envoyé un e-mail, afin de mettre à jour le drapeau, vous pouvez accéder à la ligne en utilisant son ID, donc si vous avez un index ordonné en clusters sur le champ ID (qui je l'espère est le cas), il est une opération rapide . Dans l'ensemble, je dirais que vous ne trouverez aucun avantage à nettoyer la table tout de suite, parce que vous la verrouillez pour le faire, vous fragmentez les index avec des suppressions et les sélections et mises à jour ne bénéficieraient pas autant de cette approche.

0

si 10 secondes est temps justifié pour exécuter le script et le volume de courrier est beaucoup alors ce que vous faites est d'envoi du courrier correct.Becasue est très important que la table de nettoyage.

processus de nettoyage nécessitent Sélectionnez -Insérer, sélectionnez -delete

Puisque vous dites 5,00,000 enregistrement par month.That measn vous envoyer ce courrier par mois beaucoup. donc par 10 secondes mail =

sélectionner 500000/30, sélectionner 16666/(24 * 60 * 60,0) * 10 = 2 approax courrier.

Vous envoyez donc 2 messages par 10 secondes.

Je pense que vous pouvez effectuer toutes les opérations en une seule fois.Comme l'écriture d'un déclencheur pour déplacer des données à archiver lors de la mise à jour Status = 1.

pas besoin de second planificateur.