Quels sont les premiers problèmes à vérifier lors de l'optimization d'une database existante?

Quels sont les principaux problèmes et dans quel ordre d'importance vous devez vous pencher lors de l'optimization (optimization des performances, dépannage) d'une database existante (mais inconnue de vous)?
Quelles actions / mesures dans vos optimizations précédentes ont donné le plus d'effet (avec éventuellement le minimum de travail)?

J'aimerais partager cette question dans les catégories suivantes (par ordre d'intérêt pour moi):

  1. il faut montrer l'amélioration de la performance (améliorations) dans les plus brefs timeouts. c'est-à-dire les methods / actions les plus rentables;
  2. methods les plus efficaces non intrusives ou les less problématiques (sans changer les schémas existants, etc.)
  3. methods intrusives

Mettre à jour:
Supposons que j'ai une copy d'une database sur la machine de développement sans access à l'environnement de production pour observer les statistics, les requêtes les plus utilisées, les counturs de performance, etc. en utilisation réelle.
C'est une question liée au développement mais pas au DBA.
Update2:
Supposons que la database a été développée par d'autres et m'a été donnée pour l'optimization (révision) avant qu'elle ne soit livrée en production.
Il est assez courant que le développement sous-traité soit détaché des users finaux.

En outre, il existe un paradigme de design de database selon lequel une database, contrairement au stockage de données d'application, devrait être une valeur en elle-même indépendamment des applications spécifiques qui l'utilisent ou du context de son utilisation.

Update3: Merci à tous les répondeurs! Vous m'avez tous poussé à ouvrir la sous-question
Comment chargez-vous la database de chargement de charge (server) localement?

Si le comportement d'exécution de la database ne vous intéresse pas, par exemple quelles sont les requêtes les plus fréquemment exécutées et celles qui consumnt le plus de time, vous pouvez uniquement effectuer une parsing "statique" de la structure de database elle-même. Cela a beaucoup less de valeur, vraiment, puisque vous pouvez seulement vérifier un certain nombre d'indicateurs keys de mauvaise design – mais vous ne pouvez pas vraiment en dire beaucoup sur la «dynamic» du système utilisé.

Les choses que je vérifierais dans une database que je reçois en tant que file .bak – sans la possibilité de collecter des statistics de performances d'exécution réelles et réelles – seraient:

  1. normalisation – la structure de la table est-elle normalisée à la troisième forme normale? (au less la plupart du time – il pourrait y avoir quelques exceptions)

  2. toutes les tables ont-elles une key primaire? ("si elle n'a pas de key primaire, ce n'est pas une table", après tout)

  3. Pour SQL Server: toutes les tables ont-elles un bon index de clustering? Une key groupée unique, étroite, statique et de preference toujours croissante – idéalement une ID INTENTION, et certainement pas un grand index composé de nombreux champs, pas de GUID et pas de grands champs VARCHAR (voir les excellents articles de Kimberly Tripp sur les sujets pour détails)

  4. Existe-t-il des contraintes de vérification et des contraintes par défaut sur les tables de la database?

  5. Tous les champs de key étrangère sont-ils sauvegardés par un index non clusterisé pour accélérer les requêtes JOIN?

  6. Y a-t-il d'autres «péchés mortels» évidents dans la database, par exemple des vues trop compliquées ou des tables vraiment mal conçues, etc.

Mais encore une fois: sans les statistics d'exécution réelles, vous êtes assez limité dans ce que vous pouvez faire d'un sharepoint vue "parsing statique". L'optimization réelle ne peut vraiment arriver que lorsque vous avez une charge de travail à partir d'un jour de fonctionnement régulier, pour voir quelles requêtes sont fréquemment utilisées et mettre le plus de stress sur votre database -> utilisez la list de contrôle de Mitch pour vérifier ces points.

  • Créer une reference de performance (non intrusive, utiliser des counturs de performance)

  • Identifier les requêtes les plus coûteuses (non intrusives, utilisez SQL Profiler)

  • Identifier les requêtes les plus fréquemment exécutées (non intrusif, utilisez SQL Profiler)

  • Identifiez les requêtes trop complexes ou celles qui utilisent des constructions ou des templates à exécution lente. (non intrusif à identifier, utiliser SQL Profiler et / ou des inspections de code, éventuellement intrusif si changé, peut nécessiter un re-test important)

  • Evaluez votre matériel

  • Identifier les index qui pourraient bénéficier de la charge de travail mesurée (non intrusif, utiliser SQL Profiler)

  • Mesurez et comparez à votre base de reference.

  • Si vous avez des bases de données très volumineuses ou des conditions de fonctionnement extrêmes (telles que des charges de requêtes 24/7 ou très élevées), examinez les fonctionnalités haut de gamme offertes par votre SGBDR, telles que le partitionnement table / index.

Cela peut être intéressant: Comment puis-je me connecter et find les requêtes les plus chères?

Si la database vous est inconnue et que vous êtes sous pression, vous n'avez peut-être pas le time de consulter la list de contrôle de Mitch, ce qui est une bonne pratique pour surveiller la santé du server.

Vous devez également avoir access à la production pour collecter des informations réelles à partir de requêtes variées que vous pouvez exécuter. Sans cela, vous êtes condamné. Le model de chargement du server est important: vous ne pouvez pas en reproduire beaucoup sur un server de développement, car vous n'utiliserez pas le système comme un user final.

Aussi, se concentrer sur "le plus gros coup pour l'argent". Une requête coûteuse exécutée une fois par jour à 3h du matin peut être ignorée. Un système pas très cher qui fonctionne toutes les secondes mérite d'être optimisé. Cependant, vous ne pouvez pas le savoir sans connaître le model de charge du server.

Donc, les étapes de base ..

En supposant que vous êtes firefighting:

  • les journaux du server
  • Journaux SQL Server
  • sys.sysprocesses, par exemple, ASYNC_NETWORK_IO attend

Réponse lente:

  • profiler, avec un filter de durée. Ce qui court souvent et est long
  • requête la plus coûteuse , pondérée pour la fréquence d'utilisation
  • transaction ouverte avec plan
  • indice manquant pondéré

Choses que vous devriez avoir:

  • Sauvegardes
  • Restauration testée des sauvegardes susmentionnées
  • Maintenance régulière des index et des statistics
  • DBCC régulier et controls d'intégrité

Modifier: après votre mise à jour

  • L'parsing statique est uniquement recommandée: vous ne pouvez pas optimiser l'utilisation. C'est tout ce que vous pouvez faire. C'est la réponse de Marc.

  • Vous pouvez deviner quelle est la requête la plus courante, mais vous ne pouvez pas deviner combien de données seront écrites ou à quel point une requête est mise à l'échelle avec plus de données

  • Dans de nombreux magasins, les développeurs fournissent un soutien, directement ou en tant que * 3ème ligne "

  • Si vous avez reçu une DB pour révision par une autre équipe que vous remettez à une autre équipe à déployer: c'est étrange.

La chose la plus importante à faire est de recueillir des statistics à jour. La performance d'une database dépend de:

  • le schéma;
  • datatables dans la database; et
  • les requêtes en cours d'exécution.

Regarder l'un de ces isolément est beaucoup less utile que le tout.

Une fois que vous avez recueilli les statistics, vous commencez à identifier les opérations qui sont sous-pair.

Pour ce que cela vaut, la grande majorité des problèmes de performance que nous avons résolus ont été soit en ajoutant des index, en ajoutant des colonnes et des triggersurs pour déplacer le coût des calculs du select vers l' insert/update , et en informant avec tact les users. les requêtes sont, dirons-nous, less qu'optimales 🙂

Ils sont généralement heureux que nous puissions simplement leur donner une requête équivalente qui s'exécute beaucoup plus rapidement.