2010-11-25 26 views
1

J'ai une table qui contient 2,5 millions de lignes, chaque ligne a une colonne de type xml. Tous les enregistrements doivent être supprimés et mis en file d'attente dans une file d'attente de courtier de service sqlserver lorsqu'un message arrive dans une autre file d'attente (triggerqueue). La performance est très importante et maintenant c'est trop lent. Quel serait le meilleur moyen d'y parvenir?Enqueue chaque ligne dans une file d'attente ssb à partir d'une grande table

Actuellement, nous utilisons un sp activé sur le triggerqueue qui fait dans un certain temps (@message <> null) boucle:

begin transaction 
delete top (1) from table output @tempTable 
select top 1 @message = message from @tempTable 
send on conversation @message 
commit transaction 

sont là des moyens plus rapides pour résoudre ce problème?

Soit dit en passant: avant que quelqu'un demande: nous devons commencer à partir de la table, car il est rempli avec la sortie d'une déclaration de fusion calculée précédemment

Répondre

0

donc votre problème de performance est du côté d'envoi plutôt que côté réception , droite? (c'est un peu flou de votre question). Dans ce cas, vous devez commencer par essayer:

  1. Effectuez plusieurs opérations en une seule transaction. Vous êtes le plus susceptible d'être le plus touché par les flushs log synchrones au moment de la validation.
  2. Essayez le traitement de la table plus efficace (par exemple, sélectionnez plusieurs lignes à la fois dans la table temporaire puis utilisez les curseurs pour itérer et envoyer des messages)

Si vous rencontrez des problèmes du côté de la réception, Jetez un oeil à ce great article by Remus.