Favorite de réglage des performances de trucs
Lorsque vous avez une requête ou une procédure stockée que les besoins d'optimisation des performances, quelles sont les premières choses que vous essayez?
- Voici quelques Optimisation des Requêtes SQL Server astuces
- Je suis d'accord que ce n'est pas constructif et peut être cherché dans Google, mais pourquoi il a 118 uv?! 🙂
Vous devez vous connecter pour publier un commentaire.
Ici est la portée de la main-dandy de la liste des choses que j'ai toujours donner à quelqu'un de me poser des questions sur l'optimisation.
Nous utilisons principalement Sybase, mais la plupart des conseils qui s'appliquent à l'ensemble du conseil d'administration.
SQL Server, par exemple, est livré avec une multitude de suivi de la performance /tuning bits, mais si vous n'avez pas quelque chose comme ça (et peut-être même si vous n') alors je considère être le suivant...
99% des problèmes j'ai vu sont causés par la mise trop de tables dans une jointure. Le correctif de ce est de faire la moitié de la jointure (avec certaines tables) et de mettre en cache les résultats dans une table temporaire. Puis faire le reste de la requête rejoindre sur cette table temporaire.
Requête Optimisation De La Liste De Contrôle
#temp
tables peuvent effectuer beaucoup mieux que@table
variables avec de grands volumes (en milliers de lignes).Légèrement hors sujet, mais si vous avez le contrôle sur ces questions...
De haut niveau et à fort Impact.
CREATE INDEX
Assurer il y a des indices disponibles pour votre
WHERE
etJOIN
clauses. Cela permettra d'accélérer l'accès aux données beaucoup.Si votre environnement est un de données du magasin ou de l'entrepôt, indices ne manquent pas pour presque n'importe quelle requête.
Dans un environnement transactionnel, le nombre d'index doit être plus faible et leurs définitions plus stratégique, de sorte que la maintenance d'index ne pas glisser vers le bas de ressources. (Indice est quand les feuilles de l'index doit être modifié pour refléter un changement dans la table sous-jacente, comme avec
INSERT, UPDATE,
etDELETE
opérations.)Aussi, être attentif à l'ordre des champs dans l'index - le plus sélectif (plus de cardinalité) un champ, le plus tôt dans l'index, il devrait s'afficher. Par exemple, dire que vous êtes d'interrogation pour les automobiles d'occasion:
Prix généralement plus élevés de la cardinalité. Il peut y avoir seulement quelques dizaines de couleurs disponibles, mais tout à fait peut-être des milliers de différents prix demandé.
De ces index des choix,
idx01
fournit le plus rapide chemin pour satisfaire à la requête:C'est parce que les voitures de moins de satisfaire le niveau de prix que le choix de la couleur, donnant le moteur de recherche de beaucoup moins de données à analyser.
J'ai été connu pour avoir deux très similaires indices ne diffèrent que dans le champ de commande de la vitesse des requêtes (firstname, lastname) dans l'un et l' (nom, prénom) dans l'autre.
Un truc que j'ai appris récemment que SQL Server peut mettre à jour les variables locales ainsi que les champs, dans une instruction de mise à jour.
Ou la version plus lisible:
J'ai utilisé ce pour remplacer compliqué curseurs/jointures lors de l'implémentation récursive calculs, et a également acquis beaucoup dans la performance.
Voici les détails et un exemple de code qui fait fantastique des améliorations de la performance:
http://geekswithblogs.net/Rhames/archive/2008/10/28/calculating-running-totals-in-sql-server-2005---the-optimal.aspx
En supposant que MySQL ici, utilisez EXPLIQUER pour savoir ce qui se passe avec la requête, assurez-vous que les index sont utilisés aussi efficacement que possible et essayer d'éliminer le fichier de toutes sortes. Haute Performance MySQL: Optimisation, de sauvegarde, de Réplication, et Plus est un grand livre sur ce sujet est Des Performances MySQL Blog.
@Terrapin il y a quelques autres différences entre isnull et se rejoignent qui vaut la peine de mentionner (en plus de la conformité ANSI, qui est un grand pour moi).
Unir contre IsNull
Parfois dans SQL Server si vous utilisez un OU dans une clause where, il va vraiment en prise avec la performance. Au lieu de l'utiliser OU tout simplement faire deux sélectionne et de l'union de l'ensemble. Vous obtenez les mêmes résultats à 1000x la vitesse.
Regarder la clause where - vérifier l'utilisation de l'index /vérifiez que rien n'idiot est fait
Je vais commencent généralement avec la joint - je vais frapper chacun d'entre eux hors de la requête, un à la fois et ré-exécuter la requête pour avoir une idée si il y a un particulier rejoindre, je vais avoir un problème avec.
Sur toutes mes tables temporaires, je tiens à ajouter des contraintes unique (le cas échéant) pour faire les index et les clés primaires (presque toujours).
J'ai pris l'habitude de toujours utiliser des variables de liaison. Il est possible de lier les variables ne va pas aider si le SGBDR n'a pas de cache SQL. Mais si vous n'utilisez pas de lier les variables les SGBD n'ont pas la possibilité de réutiliser des plans d'exécution de requête et analysé les instructions SQL. Les économies peuvent être considérables: http://www.akadia.com/services/ora_bind_variables.html. Je travaille surtout avec Oracle, Microsoft SQL Server fonctionne presque de la même manière.
Dans mon expérience, si vous ne savez pas si vous êtes ou non à l'aide de lier les variables, vous n'êtes probablement pas. Si votre langue de l'application ne les supporte pas, trouvez-en un qui ne. Parfois, vous pouvez résoudre Une requête en utilisant des variables de liaison pour la requête B.
Après cela, je parle de notre DBA à trouver ce qui cause le SGBDR le plus de peine. Notez que vous ne devriez pas demander "Pourquoi est-ce une requête lente?" C'est comme de demander à votre médecin de prendre sur vous à l'annexe. Assurez-vous que votre requête pourrait être le problème, mais il est tout aussi probable que quelque chose ne va pas. En tant que développeurs, nous nous avons tendance à penser en termes de lignes de code. Si une ligne est lente, correction de la ligne. Mais un SGBD est un système vraiment complexe et votre requête lente peut être le symptôme d'un problème beaucoup plus vaste.
Beaucoup trop SQL conseils de réglages sont cargo culte des idoles. La plupart du temps, le problème n'est pas lié ou faiblement lié à la syntaxe que vous utilisez, il est généralement préférable d'utiliser le plus propre syntaxe que vous le pouvez. Ensuite, vous pouvez commencer à chercher des façons d'ajuster la base de données (pas de la requête). Seulement tordre la syntaxe lorsque cela échoue.
Comme n'importe quel réglage des performances, toujours de recueillir des statistiques significatives. N'utilisez pas de wallclock temps, à moins que c'est l'expérience de l'utilisateur, vous accordez. Au lieu de regarder les choses comme le temps CPU, lignes extraites et bloque la lecture de disque. Trop souvent, les gens optimiser pour la mauvaise chose.
Première étape:
Regardez le Plan d'Exécution de Requête!
TableScan -> mauvais
NestedLoop -> meh avertissement
TableScan derrière un NestedLoop -> DOOM!
ENSEMBLE DES STATISTIQUES IO ON
ENSEMBLE DES STATISTIQUES EN TEMPS SUR
L'exécution de la requête à l'aide AVEC (NoLock) est à peu près le fonctionnement standard à ma place. Quiconque est pris à l'exécution de requêtes sur des dizaines de gigaoctets tables sans il est pris et fusillés.
Convertir PAS DANS les requêtes de JOINTURES EXTERNES gauches, si possible. Par exemple, si vous voulez trouver toutes les lignes dans le tableau 1 qui ne sont pas utilisés par une clé étrangère dans Table2, vous pourriez faire ceci:
Mais vous obtiendrez de bien meilleures performances avec ceci:
@DavidM
Dans SQL Server, plan d'exécution, vous obtient la même chose - il vous indique ce que les index sont frappés, etc.
Index de la table(s) par la clm(s) filtrer par
Pas nécessairement des performances SQL truc en soi, mais certainement liées:
Une bonne idée serait d'utiliser memcached, si possible, car il serait beaucoup plus rapide que de récupérer le fichier de données directement à partir de la mémoire plutôt que de l'obtenir à partir de la base de données. Il y a également une saveur de MySQL qui a obtenu memcached intégré (troisième partie).
Assurez-vous que votre indice de longueurs sont aussi petits que possible. Cela permet à la DB de lire plusieurs touches en même temps à partir du système de fichiers, ainsi d'accélérer vos jointures. Je suppose que cela fonctionne avec tous les DB, mais je sais que c'est une recommandation spécifique pour MySQL.
Je regarder dehors pour:
Généralement la première ligne à l'intérieur de mes procédures stockées, à moins que j'ai réellement besoin d'utiliser
@@ROWCOUNT
.Dans SQL Server, utilisez la nolock directive. Il permet la commande select pour terminer sans avoir à attendre - généralement d'autres opérations de finition.
Supprimer les curseurs où le sont pas neceesary.
Supprimer les appels de fonction dans Sprocs où un grand nombre de lignes d'appel de la fonction.
Mon collègue utilisé des appels de fonction (se lastlogindate userid à titre d'exemple) pour revenir très large de jeux d'enregistrements.
Chargé de l'optimisation, j'ai remplacé les appels de fonction dans la procédure stockée avec le code de fonction: j'ai eu beaucoup de sprocs " en cours d'exécution le délai d' > 20 secondes < 1.
J'aime utiliser
Sur
Quand je n'ai pas besoin de multiples argument de soutien qui fusionnent vous donne.
http://blog.falafel.com/2006/04/05/SQLServerArcanaISNULLVsCOALESCE.aspx
Ne pas le préfixe des noms de Procédure Stockée avec sp_ "" parce que les procédures du système commencent tous par "sp_", et SQL Server vous devez rechercher plus difficiles à trouver votre procédure lorsqu'elle est appelée.
Sale lit -
Empêche les serrures où l'intégrité transactionnelle n'est pas absolument nécessaire (ce qui est généralement le cas)
Je vais toujours dans le générateur de profils SQL (si c'est une procédure stockée avec un grand nombre de niveaux d'imbrication) ou l'exécution de la requête planner (si c'est un peu de SQL avec aucune nidification) en premier. 90% du temps, vous pouvez trouver le problème immédiatement avec l'un de ces deux outils.