9
votes

Que peut causer des performances de SQL Server Bad SQL?

Chaque fois que je découvre que la performance de la récupération de données de ma base de données est lente. J'essaie de déterminer quelle partie de ma requête SQL a le problème et j'essaie de l'optimiser et d'ajouter des indices à la table. Mais cela ne résout pas toujours le problème.

Ma question est la suivante:

Y a-t-il d'autres astuces pour mieux rendre la performance SQL Server?

Quelles sont les autres raisons qui peuvent rendre la performance SQL Server pire?


7 commentaires

Exécutez le profileur et laissez-le vous dire où la requête est lente.


Cela devrait aussi être cw. Je dis ça comme ça.


Puis-je savoir pourquoi il est marqué près?


@Pang: appartient probablement à la faute du serveur.


Je ne vois pas comment cela appartient à la faute du serveur, à moins que nous envoyions toutes les questions liées à la DBA là-bas.


Si vous voulez tuer une question de mort et que ce soit à peine, personne ne le verra, par tous les moyens, envoyez-le à la faute du serveur.


Tbh, "Qu'est-ce qui ne peut pas causer de mauvaises performances SQL Server?" .... à peu près tout ce que peut


5 Réponses :


22
votes
  • Conception inefficace de requête
  • Fichiers à croissance automatique
  • Trop d'index à maintenir sur une table
  • trop peu d'index sur une table
  • ne pas choisir correctement votre index en cluster
  • Fragmentation d'index en raison d'une mauvaise maintenance
  • fragmentation de tas en raison d'aucun index en cluster
  • trop élevés de remplissage utilisés sur des index, provoquant une scission excessive de page
  • trop bas d'un facteur de remplissage utilisé sur des index, causant une utilisation excessive de l'espace et une durée d'analyse accrue
  • n'utilise pas d'index couvertes, le cas échéant
  • Index non sélectifs utilisés
  • Maintenance inappropriée des statistiques (statistiques hors date)
  • Bases de données non normalisées correctement
  • Les journaux de transaction et les données partageant les mêmes broches de lecteur
  • la mauvaise configuration de mémoire
  • trop peu de mémoire
  • trop petit cpu
  • Disques durs lents
  • Défaut des disques durs ou autre matériel
  • Un économiseur d'écran 3D sur votre serveur de base de données à mâcher votre CPU
  • Partage du serveur de base de données avec d'autres processus qui concourent pour la CPU et la mémoire
  • verrouillage entre les requêtes
  • requêtes qui scannent toutes les grandes tables
  • Code frontal qui recherche des données de manière inefficace (boucles imbriquées, ligne à la ligne)
  • curseurs qui ne sont pas nécessaires et / ou ne sont pas rapides_forward
  • Ne pas régler Nocount lorsque vous avez de grandes tables à travers.
  • Utilisation d'un niveau d'isolation de transaction trop élevé (tel que l'utilisation sérialisable quand il n'est pas nécessaire)
  • Trop de voyages ronds entre le client et le serveur SQL (une interface chatty)
  • une requête de serveur lié inutile
  • Une requête de serveur liée qui cible une table sur un serveur distant sans clé primaire ou candidate définie
  • Sélectionner trop de données
  • Recompilations de requête excessive

    Oh et il pourrait y avoir des autres aussi.


5 commentaires

Lol peut-être demain je pourrais ajouter encore plus :)


Superbe liste, mais qui sont importants que les autres? + "Délai aller-retour entre SQL Server et Client"


@Dennis, cela dépend! Ajout de votre suggestion aussi :)


Cela résume à peu près tout ! En particulier les "trop ​​nombreux indices" et "trop ​​peu d'indices" ;-) Trouver les bons et le bon nombre d'indices est un art noir :-)


Heureux que vous mettiez d'abord de la conception de requête inefficace! C'est l'une des premières choses que je vérifie et la plupart du temps, je n'ai pas besoin d'aller plus loin que cela.



0
votes

Si vous êtes nouveau dans la base de données et que vous avez accès au conseiller de syntonisation du moteur de base de données, vous pouvez régler votre base de données suristiquement.

Vous capturez essentiellement que les requêtes SQL sont exécutées contre votre DB dans le profileur SQL, puis nourrissez ceux qui sont deta. Deta exécute efficacement les requêtes (sans altération de vos données), puis évolue quelles informations sont manquantes de votre base de données (vues, index, cloisons, statistiques, etc.) pour mieux faire les requêtes.

Il peut ensuite les appliquer pour vous et les surveiller à l'avenir. Je ne dis pas de supposer que Deta a toujours raison ou de faire des choses sans comprendre, mais j'ai découvert que c'est certainement un bon moyen de voir ce que vos requêtes font, combien de temps ils prennent et comment vous pouvez indexer la DB de manière appropriée.

PS: avec tout ce qui dit, il est beaucoup préférable d'investir dans un bon DBA au début d'un projet afin d'avoir de bonnes structures et d'indexation pour commencer. Mais ce n'est pas la position que vous êtes en ce moment ...


0 commentaires

2
votes

Quand je parle à de nouveaux développeurs qui ont ce problème, je constate généralement que c'est à cause de l'un des deux problèmes. Les deux sont fixes si vous suivez ces 2 règles.

Premièrement, ne récupérez aucune donnée dont vous n'avez pas besoin. Par exemple, si vous faites une pagination, ne ramenez pas 100 rangées, puis calculez ceux-ci appartenant à la page. Demandez à la tâche stockée de la figure et ne récupérez que les 10 que vous avez besoin.

Deuxièmement, rien n'est plus rapide que le travail que vous ne faites pas. Par exemple, j'ai travaillé sur un système où les rôles et les droits complets d'un utilisateur ont été récupérés avec chaque page demandée - c'était 100 des lignes pour certains utilisateurs. Encore simplement cela à l'état de la session sur la première demande, puis l'utiliser à partir de là pour que les demandes ultérieures ont pris un poids significatif de la base de données.


0 commentaires

1
votes

Vous suggère d'obtenir un bon livre sur le réglage des performances pour la base de données que vous utilisez (c'est très spécifique à la base de données). C'est un sujet extrêmement complexe et ne peut pas être répondu vraiment autre que dans les généralités sur le Web.

Par exemple, Dave Markle vous indique que vos requêtes inefficaces peuvent causer le problème et il existe de nombreuses façons d'écrire des requêtes inefficaces et de nombreux moyens de les réparer.


0 commentaires

0
votes

C'est une très grande question. Et il y a déjà une tonne de réponses. Je voudrais toujours ajouter un facteur important - Split Page . Le problème est - il y a de bonnes divisions et de mauvais scissions. Voici de bons articles expliquant comment utiliser transaction_log Événement étendu pour identifier les scissions de page Bad / Nasty

  1. Suivi des pages problématiques Splits dans les événements étendus SQL Server 2012 - Jonathan Kehayias
  2. page de suivi des fissures à l'aide du journal de transaction - Paul Randal

    vous avez mentionné:

    J'essaie d'optimiser et d'ajouter des index

    Mais, parfois, l'élimination parfois des indices non mis en cluster non utilisés peut aider à améliorer les performances telles qu'elles aident à réduire les grumes de transaction. Lire principales raisons de la performance du journal Problèmes

    Statistiques d'attente, ou s'il vous plaît dites-moi où ça fait mal donne une idée de l'utilisation des statistiques d'attente pour l'analyse de la performance.

    Pour voir des idées fraîches pour la performance, jetez un coup d'œil à Considérations de performance - SQLMAG.com

    1. Tables distinctes dans des jointures à différents disques (pour les groupes d'E / S parallèles de disques - FileGroups).
    2. Évitez les jointures sur des colonnes avec quelques valeurs uniques.

      Pour comprendre rejoindre , lire Advanced JOIN TECHNIQUES < / a>