web-dev-qa-db-fra.com

Limiter la CPU / UTILISATION DE MEMORY pour une requête dans SQL Server 2008R2

Nous avons un processus ad-hoc à partir de l'équipe d'application qui récupère des données de l'une de nos bases de données lourdement utilisées OLTP dans SQLServer pour migrer les données en MongoDB.

Au cours de la mesure de performance, nous pouvons voir cette partie de leur course lors de la récupération de données de ce serveur SQL, il existe une pointe dans la CPU pendant presque une heure, de la piqûre à près de 60 à 80%.

Par conséquent, pour réduire cet impact, nous pensons à utiliser le gouverneur de ressources pour limiter les ressources de la CPU/Mémoire. Je n'ai jamais utilisé RG, mais la lecture des blogs semble que cela puisse être idéal.

Veuillez suggérer si cela peut être atteint ou de meilleures suggestions par votre expérience.

L'activité ci-dessus est mensuelle une fois la récupération d'environ 80 millions de données sur 5 TB Database dans SQL Server 2008R2

4
BeginnerDBA

La reponse courte est oui'. Vous pouvez utiliser RG pour limiter la consommation de la CPU de ce processus. Notez que RG est uniquement disponible dans les éditions Enterprise et Data Center de SQL Server 2008R2. Utilisez la documentation Microsoft Excellente promenade pour en savoir plus sur l'utilisation de RG: Resource Gouvernor Comment sur Topics

Réponse plus longue - RG ne traite pas de la cause fondamentale, c'est une aide au groupe pour aider avec les symptômes et rendre la maladie moins perturbante aux autres utilisateurs. Si j'étais à votre place, avant de recourir à la RG Solutions, j'investirais un peu de temps à essayer d'optimiser le processus lui-même. Bien que "accéder à 80 millions de rangées" ne signifie pas beaucoup, et il suffit d'accéder aux lignes de données ne devrait pas consommer beaucoup de processeur. Mon expérience s'est avérée à nouveau et à nouveau que de nombreux processus prennent des heures, peuvent être réduits à des minutes (et dans certains cas, à des secondes), et être faits pour consommer des ordres de grandeur moins de ressources que l'original. L'effort d'optimisation devrait inclure non seulement les techniques, telles que l'indexation correcte, le schéma des modifications de schéma, la syntaxe de la requête et l'enquête sur le plan, mais également une évaluation de niveau supérieur de l'architecture et de la circulation de processus, fait-elle une mise à jour complète ou incrémentale? Combien de fois accumulez-vous les mêmes tables? Y a-t-il de nombreuses tables temporaires impliquées? Trop de pas? Peut-être que des travaux redondants étant-ils faits? Si vous fournissez plus de détails sur le processus et pourquoi il faut tellement de processeur, les gens ici seront heureux de vous aider.

Bien sûr, il n'y a aucune garantie que vous réussirez et, éventuellement, vous risquez de vous recourir à l'utilisation de RG, mais à l'OMHO, l'effort vaut la peine.

6
SQLRaptor

Puisque vous envisagez de limiter les ressources au cours de la fenêtre de l'opération, je comprends que vous êtes concerné par l'impact de cette requête sur les transactions actives (car c'est votre OLTP).

C'est donc possible de:

  1. utilisez un instantané et demandez à votre requête cette question (comme base de données séparée) pouvant prélever des problèmes de contention pendant la fenêtre de requête;

  2. déplacez la requête "hors des heures". Il semble que cette requête ne soit pas sensible au temps, cela pourrait-il se produire dans les petites heures du matin, comme exemple.

  3. Modifiez le calendrier afin que cette requête soit exécutée chaque semaine au lieu de tous les mois. De cette façon, vous avez un impact moins "dur" pendant le processus.
  4. construisez des données dans une table/une base de données/serveur distincte pendant le mois. Ensuite, la requête peut frapper ces tables à la place.
  5. Si votre version est suffisamment nouvelle, utilisez des tables en mémoire ou des tables TEMP sur votre sous-système de stockage le plus rapide.

Dallas