2011-07-29 3 views
0

J'essaie de comprendre comment je peux paralléliser un code de procédure pour créer des enregistrements dans une table.Paralléliser TSQL CLR Procédure

est ici la situation (désolé je ne peux pas donner beaucoup de la manière de code réel):

Je dois prévoir quand un service de véhicule sera nécessaire, en fonction de la date de service précédent, le kilométrage actuel, le kilométrage quotidien prévu et la différence de kilométrage entre chaque service. Dans l'ensemble, c'est très procédural, pour chaque véhicule, je dois prendre en compte son historique, son état de service actuel, le kilométrage journalier (qui peut changer en fonction des plages définies dans le plan de kilométrage), et la séquence de entretien.

Actuellement, je calcule tout cela en PHP, et cela prend environ 20 secondes pour 100 véhicules. Comme cela pourrait être étendu à plusieurs milliers, 20 secondes sont beaucoup trop longues.

J'ai donc décidé d'essayer de le faire dans une procédure stockée CLR. Au début, j'ai pensé que j'essaierais de le multithread, mais j'ai rapidement découvert que ce n'était pas facile à faire dans l'hôte TSQL. Il m'a été recommandé d'autoriser TSQL à travailler sur la parallélisation elle-même. Pourtant, je n'ai aucune idée de comment. S'il n'y avait pas le fait que le code doit créer des enregistrements que je pourrais le définir en fonction et faire:

SELECT dbo.PredictServices([FleetID]) FROM Vehicles 

Et TSQL devrait comprendre qu'il peut paralléliser, mais je ne connais pas d'autre alternative pour les procédures.

Y at-il quelque chose que je peux faire pour paralléliser cela?

Répondre

0

La recommandation que vous avez reçue est la bonne. Vous n'avez simplement pas les fonctionnalités du framework .NET pour le parallélisme disponibles dans votre procédure stockée CLR. Gardez également à l'esprit que la niche pour les procédures stockées CLR est plutôt étroite et qu'elle a un impact négatif sur les performances et l'évolutivité de SQL Server.

Si je comprends bien la tâche, vous devez calculer une fonction PredictServices pour certains enregistrements et stocker les résultats dans la base de données. Dans ce cas, les procédures stockées CLR peuvent être votre option à condition que PredictServices ne soit qu'un accès aux données/une simple transformation des données. La meilleure pratique consiste à créer un service WWF (Windows Workflow Foundation) pour effectuer des calculs et l'appeler depuis PHP. Dans Workflow Service, vous pouvez implémenter n'importe quelle solution, y compris une impliquant le parallélisme.

Questions connexes