2009-12-22 7 views
4

J'essaie de comprendre les performances d'une requête que j'ai écrite dans Oracle. A ce moment, je n'ai accès qu'à SQLDeveloper et à son timer d'exécution. Je peux exécuter SHOW PLAN mais je ne peux pas utiliser la fonction de trace automatique.Performance Oracle via SQLDeveloper vs application

La requête que j'ai écrite s'exécute en environ 1,8 secondes lorsque j'appuie sur «exécuter la requête» (F9) dans SQLDeveloper. Je sais que cela ne récupère que les cinquante premières lignes par défaut, mais puis-je au moins être certain que les 1,8 secondes englobent le temps d'exécution total plus le temps de livrer les 50 premières lignes à mon client? Lorsque j'emballe cette requête dans une procédure stockée (renvoyer les résultats via un OUT REF CURSOR) et que j'essaie de l'utiliser à partir d'une application externe (SQL Server Reporting Services), la requête prend plus d'une minute à s'exécuter. J'obtiens des performances similaires lorsque j'appuie sur "Exécuter le script" (F5) dans SQLDeveloper. Il semble que la différence ici est que dans ces deux scénarios, Oracle doit retransmettre toutes les lignes plutôt que les 50 premières. Cela m'amène à penser qu'il existe des problèmes de connectivité réseau entre le PC client et l'instance Oracle. Ma requête renvoie seulement environ 8000 lignes donc cette performance est surprenante. Pour essayer de prouver ma théorie au-dessus de la latence, je courais un peu de code comme ceci dans sqldeveloper:

declare 
    tmp sys_refcursor; 
begin 
    my_proc(null, null, null, tmp); 
end; 

... Et cela va dans environ deux secondes. Encore une fois, l'horloge d'exécution de SQLDeveloper indique-t-elle avec précision l'heure d'exécution de la requête? Ou est-ce que je manque quelque chose et est-ce possible que c'est en fait ma requête qui a besoin de réglage?

Quelqu'un peut-il m'expliquer s'il vous plaît tout cela basé sur les outils limités dont je dispose? Ou devrais-je essayer d'impliquer le DBA pour faire une analyse plus approfondie?

+1

Il serait utile que vous puissiez publier la requête, une description des tables, des index, etc., et le plan d'exécution. –

Répondre

5

« Je sais que ce n'est aller chercher les cinquante premières lignes par défaut, mais je peux au moins être certain que les 1,8 secondes englobe le temps total d'exécution plus le temps de livrer le premier 50 lignes à mon client ? "

Non, il est temps de renvoyer les 50 premières lignes. Il ne nécessite pas nécessairement que la base de données ait déterminé l'ensemble de résultats complet. Pensez à la table comme une encyclopédie.

Si vous voulez une liste d'animaux avec des noms commençant par 'A' ou 'Z', vous obtiendrez probablement des Aardvarks et des Alligators assez rapidement. Il faudra beaucoup plus de temps pour obtenir des zèbres que vous auriez à lire le livre entier. Si votre requête effectue une analyse de table complète, elle ne se terminera pas tant qu'elle n'aura pas lu la table entière (ou le livre), même s'il n'y a rien à récupérer après le premier chapitre (car elle ne s'y connaît pas). n'y a rien d'important là-dedans tant qu'il ne l'a pas lu).

declare 
    tmp sys_refcursor; 
begin 
    my_proc(null, null, null, tmp); 
end; 

Ce morceau de code ne fait rien. Plus précisément, il analysera la requête pour déterminer si les tables, les colonnes et les privilèges nécessaires sont en place. Il n'exécutera pas réellement la requête ou ne déterminera pas si des lignes répondent aux critères de filtrage.

Si la requête ne renvoie que 8000 lignes, il est peu probable que le réseau constitue un problème important (sauf s'il s'agit de très grandes lignes).

Demandez à votre administrateur de base de données un didacticiel rapide sur l'optimisation des performances.