2010-07-21 27 views
1

Existe-t-il un moyen dans TOAD ou dans un autre outil de surveiller les requêtes en cours d'exécution par votre application web?Comment surveiller les plans d'exécution de requête DB d'application Web?

Je voudrais examiner les plans d'explication/d'exécution pour les requêtes de l'application Web.

Je débogue les raisons pour lesquelles les requêtes webapp sont plus lentes que celles exécutées depuis sqlplus.

+0

Avez-vous la preuve que la requête elle-même prend plus de temps ou est-ce l'expérience de l'utilisateur à l'avant? Je travaille généralement avec des développeurs pour instrumenter leur code afin de montrer l'heure de l'exécution de la requête et le temps nécessaire pour récupérer les résultats, cela nous rapproche d'habitude beaucoup plus de déterminer où le temps est passé. Souvent, ils ont un code inefficace qui rend les résultats et c'est là que le temps «supplémentaire» est pris en compte. –

+0

Eh bien la preuve pourrait être un peu forte d'une description :-) mais oui j'ai défini des points d'arrêt dans le code où la requête est exécutée et cela prend quelques secondes dans l'application et seulement quelques millisecondes dans SQLPlus –

Répondre

2

Généralement, vous pouvez suivre et analyser trois points. Tout d'abord SQL, principalement par le biais de la vue v $ sql. Secondement à travers la session (en commençant par la session v $). Enfin à travers le temps (mesure, normalement au niveau d'un système ou d'une session, pendant un certain temps).

Si une instruction SQL particulière, telle que la table SELECT * FROM WHERE type =: val, est exécutée, la base de données en fera un hachage rapide et verra s'il y a une instruction correspondante dans le cache. L'instruction doit non seulement correspondre au texte, mais également à certains paramètres environnementaux (tels que l'utilisateur de l'analyse, l'objectif de l'optimiseur, les types de variable de liaison, les paramètres NLS ...).

S'il n'y a pas d'instruction correspondante, la base de données la transmettra à l'optimiseur pour créer un plan de requête. S'il y a correspondance, le plan déjà déterminé pour cette déclaration sera utilisé.

Donc, je suggère que votre première étape consiste à prendre un SQL qui a été exécuté à la fois par l'application Web et de sqlplus et voir si elle utilise le même plan. Vous devriez être capable de regarder dans v $ sql pour la déclaration d'intérêt et voir combien d'occurrences il a).

Si vous avez plusieurs occurrences, en particulier avec des valeurs MODULE/ACTION/SERVICE différentes, vous pouvez consulter les plans pour voir s'ils diffèrent (DBMS_XPLAN.DISPLAY_CURSOR). Si vous n'avez qu'une seule occurrence, le SQL est partagé et vous devez adopter une approche différente pour isoler les exécutions d'applications Web des exécutions sqlplus. Une manière de le faire serait de suivre l'exécution du SQL à la fois à travers une session d'application web et une session sqlplus (DBMS_MONITOR). Puis tkprof ou similaire sur les fichiers de trace et recherchez les différences.

ne peut pas vous aider à le faire à travers TOAD, mais vous ne pouvez pas vous tromper en comprenant les outils et techniques sous-jacents.

+0

Merci, bonne réponse. Étant donné une ligne dans v $ sql, comment pouvez-vous voir le plan d'affichage? –

+0

En supposant 10g ou plus tard, v $ sql a une colonne sql_id (avec une valeur comme fdxrh8tzyw0yw). Vous pouvez voir le plan d'explication avec un select * from table (dbms_xplan.display_cursor ('fdxrh8tzyw0yw')); –

1

Oui. Il existe un moyen de surveiller les appels d'une application Web pour interroger la base de données dans Oracle TOAD.

START -> All Programs -> Quest Software -> TOAD for Oracle -> Tools -> SQL Monitor 

Avec cet outil, vous sélectionnez le processus ([TOAD, Web_dev (I dont remember the name of debug)] "en cours d'exécution" dans ce cas, "debug" aussi). Cet outil affiche la procédure ou la fonction stockée appelant l'application.