Question

J'ai eu un gros travail de conversion - 299 Go d'images JPEG déjà présentes dans la base de données, en équivalents miniatures à des fins de rapport et de bande passante.

J'ai écrit une fonction SQLCLR sans danger pour les threads pour ré-échantillonner les images, très bon travail.

Le problème est que, lorsque je l'exécute dans une instruction UPDATE (du champ PhotoData au champ ThumbData), cela s'exécute de manière linéaire pour éviter les conditions de concurrence critique, en utilisant un seul processeur pour rééchantillonner les images.

Alors, comment utiliser au mieux les 12 cœurs et la configuration de phat raid de cette machine de base de données? Faut-il utiliser une sous-requête dans la clause FROM de l'instruction update? Est-ce tout ce qui est nécessaire pour activer le parallélisme sur ce type d'opération?

Quoi qu’il en soit, l’opération est divisée en lots, environ 4 000 images par lot (dans une requête fenêtrée d’environ 391 000 images), cette machine a beaucoup de ressources à graver.

Était-ce utile?

La solution

Je recommande également le " round-robin " méthodologie préconisée par kragen2uk et onupdatecascade (je les vote). Je sais que j'ai lu quelque chose d'irritant au sujet des routines CLR et du paralellisme SQL, mais j'oublie ce que c'était en ce moment ... mais je pense qu'ils ne jouent pas bien ensemble.

Le peu que j’ai fait par le passé sur des tâches similaires consistait à configurer un tableau répertoriant chaque lot de travail à effectuer. Pour chaque connexion que vous établissez, il va à cette table, déplace le lot suivant, le marque comme étant en cours de traitement, le traite, le met à jour comme étant Terminé et se répète. Cela vous permet d’évaluer les performances, de gérer la mise à l’échelle, d’autoriser les arrêts et les redémarrages sans avoir à recommencer, et de vous montrer à quel point la tâche est complète (et encore moins de montrer qu’elle fait vraiment quelque chose).

Autres conseils

Vérifiez les paramètres de configuration pour le degré de parallélisme maximum (MAXDOP) sur votre serveur SQL. Vous pouvez également définir la valeur de MAXDOP.

Ce lien peut vous être utile http://www.mssqltips.com/ tip.asp? tip = 1047

acclamations

Ne pouvez-vous pas scinder la requête en lots et exécuter chaque lot séparément sur une connexion distincte? SQL Server utilise uniquement le parallélisme dans une requête quand bon lui semble, et bien que vous puissiez l'arrêter, ou même l'encourager (un peu) en modifiant le seuil de coût pour l'option de parallélisme en O, mais je pense que c'est assez aléatoire.

Une chose à noter est qu’elle décidera uniquement d’utiliser le parallélisme au moment de la compilation de la requête. De même, si la requête est compilée à un moment où la charge du processeur est élevée, le serveur SQL est moins susceptible de considérer le parallélisme.

Trouvez des critères pour diviser l'ensemble en sous-ensembles distincts de lignes (1-100, 101-200, peu importe), puis appelez votre instruction de mise à jour à partir de plusieurs connexions en même temps, chaque connexion gérant un sous-ensemble de lignes. dans la table. Toutes les connexions doivent fonctionner en parallèle.

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