2010-11-15 13 views
1

Désolé pour la longue introduction mais avant que je puisse poser ma question, je pense que donner le contexte aiderait à mieux comprendre notre problème. Nous utilisons sql server 2008 pour nos services web en tant que backend et de temps en temps, il faut trop de temps pour répondre aux demandes qui doivent être exécutées très rapidement, comme prendre plus de 20 secondes pour une demande de sélection qui interroge une table qui n'a que 22 lignes. Nous avons parcouru de nombreuses zones potentielles pouvant causer le problème des index vers les procédures stockées, les triggers, etc., et nous avons essayé d'optimiser ce que nous pouvons supprimer des index qui ne sont pas lus mais écrivent fréquemment ou ajoutent NOLOCK à nos requêtes select pour réduire le verrouillage. tables (nous sommes OK avec des lectures sales). Nous avons également demandé à nos administrateurs de base de données d'examiner le serveur et de comparer les composants pour détecter les goulets d'étranglement dans le processeur, la mémoire ou le sous-système de disque, et nous avons également constaté que le matériel était également OK. Et comme les piques se produisent occasionnellement, il est vraiment difficile de reproduire l'erreur sur la production ou le développement parce que la plupart du temps, lorsque nous réexécutons la même requête, les temps de réponse attendus sont courts et non pas ceux qui ont été expérimenté plus tôt. Cela dit, j'ai presque eu des doutes sur les E/S, même si cela ne semble pas être un goulot d'étranglement. Mais je pense que j'étais juste capable de reproduire l'erreur après avoir exécuté un rapport de fragmentation d'index pour une table spécifique sur le serveur, qui a immédiatement causé des piques dans les demandes non seulement sur cette table mais également dans d'autres requêtes. Et puisque la base de données et le serveur sont partagés avec d'autres applications que nous utilisons et que des requêtes peuvent être lancées de temps en temps sur le serveur et la base de données qui est longue, nous nous méprenons sur les goulots d'étranglement occasionnels des E/S est, je crois, devenir un fait. Par conséquent, je veux trouver un moyen de hiérarchiser les demandes provenant de services Web qui seront traités même si d'autres requêtes sensibles aux ressources sont en cours d'exécution. Je cherchais une sorte de hiérarchisation que j'ai décrite ci-dessus depuis le tout début du processus de résolution et j'ai découvert que SQL Server 2008 dispose d'une fonctionnalité appelée 'Resource Governor' qui permet de hiérarchiser les demandes. Cependant, comme je ne suis pas un expert en matière de gouverneur de ressources ni un administrateur de bases de données, je voudrais demander à d'autres personnes qui ont utilisé ou utilisent le gouverneur de ressources, si je peux classer les E/S par ordre de priorité. connexion ou une procédure stockée spécifique (Par exemple, si un processus intensif d'E/S est en cours d'exécution au moment où nous recevons une requête de service Web, le serveur SQL peut-il arrêter ou ralentir l'activité d'E/S pour ce processus? à la demande que nous venons de recevoir?).Priorisation des E/S pour une requête spécifique dans le serveur SQL

Merci à tous ceux qui passent du temps à lire ou à donner un coup de main à l'avance.

Certains matériels Détails:
CPU: 2x Quad Core AMD Opteron 8354
Mémoire: 64 Go
Sous-système de disque: série Compaq EVA8100 (je ne suis pas sûr, mais il devrait être RAID 0 + 1 accross 8 disques HP HSV210 SCSI PS: Et je peux presque 100% sûr que les serveurs d'applications ne causent pas l'erreur et il n'y a aucun goulot d'étranglement que nous pouvons identifier là.

Mise à jour 1:

Je vais essayer de répondre autant que possible pour les questions suivantes qui GBN posées ci-dessous. S'il vous plaît laissez-moi savoir si vous cherchez quelque chose d'autre.

1) Quel type de maintenance d'index et de statistiques avez-vous s'il vous plaît?
Nous avons un travail hebdomadaire qui défragmente les index tous les vendredis. En plus de cela, les statistiques de création automatique et les statistiques de mise à jour automatique sont activées. Et les pointes se produisent à d'autres moments que le travail de fragmentation.

2) Quel type de volumes de données d'écriture avez-vous? Difficile de répondre.En plus de nos services web, il y a une application frontale qui accède à la même base de données et des requêtes nécessitant des ressources périodiques doivent être lancées à ma connaissance, cependant, je ne sais pas comment, disons, chaque semaine ou chaque jour, inscrivez le montant à DB.

3) Avez-vous profilé des événements de recompilation et de mise à jour des statistiques?
Désolé de ne pas pouvoir comprendre celui-ci. Je n'ai pas compris ce que vous me demandez par cette question. Pouvez-vous fournir plus d'informations pour cette question, si possible?

Répondre

1

d'abord pensé que statistics sont en cours de mise à jour en raison du seuil de changement de données est atteint causant des plans d'exécution à reconstruire.

  • Quel genre de maintenance d'index et de statistiques avez-vous s'il vous plaît? Remarque: la maintenance de l'index met à jour les statistiques de l'index, et non les statistiques de colonne: vous pouvez avoir besoin de mises à jour de statistiques distinctes.
  • Quel type de volumes de données d'écriture avez-vous?
  • Avez-vous profilé les événements de recompilation et de mise à jour des statistiques?
+0

Eh oui, les statistiques étant mis à jour a été ma première pensée trop mais si l'on considère une table de 22 dossiers est-il toujours probable? Nous aurions besoin d'en savoir plus sur la volatilité des données dans le tableau, je pense. La recompilation est certainement une possibilité. L'affiche doit être capable de mesurer le temps de compilation pour la requête peu performante. –

+0

@ John Sansom: La chose de 22 rangs pourrait être bloquant bien. Peut-être que c'est trompeur aussi avec un serveur "décrochage" – gbn

+0

J'ai besoin de trouver des réponses aux questions que vous avez posées aux gars, puisque je ne suis pas très familier avec ce genre de choses. J'essaierai de faire demi-tour dès que possible, mais cela pourrait prendre un certain temps avant que j'obtienne des réponses de notre équipe de DBA. Merci de votre intérêt pour le moment. – Ferhat

0

En réponse à la question 3) de votre mise à jour à la question d'origine, jetez un oeil à la référence suivante sur SQL Server Pedia. Il fournit une explication de ce que sont les recompilations de requêtes et explique également comment vous pouvez surveiller ces événements. Ce que je crois que gbn demande (n'hésitez pas à me corriger monsieur :-)) est que vous voyez recompiler les événements avant l'exécution lente de la requête gênante. Vous pouvez rechercher cela en utilisant le profileur SQL Server.

Reasons for Recompiling a Query Execution Plan

+0

Salut John, merci pour l'info et le lien. Une fois que je l'aurai vérifié, et j'espère trouver :), j'essaierai de revenir avec des informations supplémentaires que je pourrais trouver. – Ferhat