10
votes

Comment mesurer la performance de la requête à Oracle

Je suis nouveau à Oracle DB. J'ai 2 questions qui renvoient le même ensemble de résultats. Je veux mesurer la performance de chacun d'eux et choisir le meilleur. Comment puis-je faire cela utilisant le développeur Oracle SQL? Je me souviens de lire que certains outils fournissent des statistiques. Tous les pointeurs sur la façon de lire ces statistiques?

Mise à jour: Comme suggéré par Rob Van, j'ai utilisé l'utilitaire TKProf pour trouver la performance de mes questions. Quelques paramètres que je pouvais comprendre (compter, rangées, temps écoulé, heure d'exécution), mais la plupart je ne pouvais pas. Quelqu'un peut-il m'aider avec la signification de ces paramètres? Vous trouverez ci-dessous les résultats. P>

Query 1:
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       49      0.26       0.32         45        494          0       23959
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       51      0.28       0.33         45        494          0       23959

Query2:
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       33      0.25       0.24          0        904          0       15992
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       35      0.25       0.24          0        904          0       15992


2 commentaires

Vous avez mentionné que la requête 1 et la requête 2 renvoie le même ensemble de résultats. Cependant, le fichier TKProf montre que la requête 1 retourne 23959 lignes et la requête 2 renvoie 15992 lignes. Pas exactement égal ...


Okie La requête fait partie d'une création de vue. Le nombre de lignes retournées est différent car la manière dont les requêtes créent la vue sont différentes. La 1ère requête utilise les syndicats et la 2e requête utilise LOJ et puisque la 1ère requête utilise unios, quelques enregistrements sont dupliqués qui ne se produisent pas dans le cas de la deuxième requête


4 Réponses :


13
votes

Il y a un bouton au-dessus de l'éditeur SQL appelé "Expliquer le plan". Cet outil vous indiquera ce que chaque route coûte et comment la déclaration utilisera des index et des partitions. Remarque, vous pouvez obtenir une erreur, votre DBA devra éventuellement activer une fonctionnalité de votre compte utilisateur, je pense que c'est «trace», mais cela pourrait être faux sur ce point. Lecture de l'instruction Execute Sortie peut être difficile au début, mais c'est un bon outil pour aider à écrire de la bonne SQL.


3 commentaires

Thx.yep j'ai vu les résultats sous l'onglet Explique. Une colonne appelée coût apparaît avec des chiffres. Je devrais creuser des docs Oracle pour interpréter ce que ces chiffres signifient


Je recommande fortement de creuser dans ces documents. Faites du googling sur l'optimisation et le réglage Oracle. (Burleson a quelques bonnes choses - Google "Oracle Burleson" pour voir un site de conseil comprenant des conseils.) Et consultez ceci pour un aperçu de ce que vous voyez avec "Expliquer le plan". akadia.com/services/ora_interpretting_explain_plan.html Comme indiqué dans un autre commentaire, juste vérifier la vitesse ne veut pas dire grand chose. L'environnement peut changer les choses - rapidement dans un seul réglage peut être lent dans un autre.


Mais apprendre que les choses peuvent prendre du temps. Vérifiez-vous le mieux, vérifiez la vitesse pour l'instant, puis absorber autant que vous le pouvez et syntonisez autant que vous allez.



3
votes

Réponse de base - Exécutez chaque requête plusieurs fois et voir lequel est plus rapide. Meilleure partie - Vous pouvez le faire sans apprendre sur les performances Oracle. La seule chose que vous devez savoir est que vous ne pouvez pas faire confiance au premier essai, car la plupart du temps, il va lire les données du disque tandis que le second essais utilise des données en cache de RAM. C'est pourquoi vous essayez chaque requête plusieurs fois.


2 commentaires

Et si la requête "plus rapide" utilise beaucoup d'espace temporaire? Une fois transférées à la production, plusieurs utilisateurs utilisant cet espace Temp, la requête "plus rapide" pourrait devenir plus lente car elle pourrait commencer à se poser. Le problème de la détermination de la vitesse de requête est que la réponse est toujours "cela dépend". Il est préférable d'utiliser expliquer le plan d'explication, de prendre note d'espace temporaire utilisé, puis d'évaluer en termes d'environnement serveur. Bien que ce soit difficile de bien faire - j'apprends toujours.


Expliquer le plan est bon, mais vous devez d'abord être capable de le lire. Si vous devez faire un choix aujourd'hui entre deux questions et vous n'avez pas vu Expliquer des outils de plan dans toute votre vie, cette boucle imbriquée / HASH Join / Index Plage Scan / Index FFS ne vous aidera pas vraiment. Si vous avez des semaines disponibles, assurez-vous d'abordez d'abord les performances Oracle et écrivez des requêtes plus tard.



2
votes

sur OTN, Randolf Geist et moi avons écrit deux postes sur la façon de mesurer la performance. Si vous le faites comme indiqué dans ces threads, vous aurez rassemblé des informations pour pouvoir choisir le meilleur.

Si vous voulez la version complète, visitez Randolf's . < / p>

Si vous voulez une version courte, visitez MINE : < / p>

Les deux threads expliquent comment utiliser expliquer le plan et la traçage pour voir où le temps est dépensé. Ensuite, il vous appartient de décider de ce que vous êtes exactement qualifié de «mieux». Cela peut être le temps le plus court écoulé, le moins de ressources usagées, ou le plus petit nombre de verrous, ou peut-être autre chose.

J'espère que cela aide.

Cordialement, Rob.


1 commentaires

Les liens sont morts



4
votes

J'ai bien peur que le plan explique est le seul moyen. Commencez par supposer qu'un coût inférieur (si vous regardez le plan d'explication, il devrait y avoir une colonne appelée coût) est préférable, mais vous devez en retirez-vous pour que vous en appreniez de plus en plus. Peut-être que vous avez un dBA là-bas que vous pourriez discuter des choses à travers? Sans avoir vos données et les requêtes, il est difficile de conseiller davantage

Pour quelque chose à voir avec le développement d'Oracle, un bon endroit pour commencer est n'importe quoi de Tom Kyte (Google lui) ou de la recherche via Le site Web Ask Tom . Si vous voulez vraiment vous impliquer

L'exécution de la requête seulement à quelques reprises est une très mauvaise idée - équivalente à juste accepter que le coût du plan d'explication vous indique la meilleure requête. Vous devez vraiment prendre en compte les ressources que votre requête prend et donc comment cela pourrait affecter votre système de production.

Selon la fréquence à laquelle la requête est appelée affecte la manière dont vous avez besoin de suivre la performance d'une requête (désolée pour les puristes, mais cela). Si la requête ne fonctionne qu'une fois par semaine et prend une minute pour exécuter sans rien affecter d'autre Avez-vous besoin d'optimiser cette requête? Est-il plus facile pour la maintenance d'utiliser une requête qui est plus facile à suivre logiquement?

Si la requête est appelée plusieurs fois une seconde, vous devez comprendre complètement le plan d'explication et avoir une meilleure compréhension sur la manière dont vous pouvez optimiser la requête à ses meilleures performances


0 commentaires