web-dev-qa-db-fra.com

Oracle: existe-t-il un outil pour suivre les requêtes, comme Profiler pour SQL Server?

je travaille avec SQL Server, mais je dois migrer vers une application avec Oracle DB Y at-il quelque chose d'équivalent pour Oracle?

71
stefano m

Vous pouvez utiliser Oracle Enterprise Manager pour surveiller les sessions actives, avec la requête en cours d'exécution, son plan d'exécution, ses verrous, des statistiques et même une barre de progression pour les tâches plus longues.

Voir: http://download.Oracle.com/docs/cd/B10501_01/em.920/a96674/db_admin.htm#1013955

Allez sur Instance -> sessions et regardez l'onglet SQL de chaque session. 

Il y a d'autres moyens. Enterprise Manager ajoute simplement avec de jolies couleurs ce qui est déjà disponible dans les vues spéciales telles que celles décrites ici: http://www.Oracle.com/pls/db92/db92.catalog_views?remark=homepage

Et, bien sûr, vous pouvez également utiliser l'outil EXPLAIN PLAN FOR, TRACE et bien d'autres méthodes d'instrumentalisation. Le gestionnaire d'entreprise contient des rapports sur les requêtes SQL les plus coûteuses. Vous pouvez également rechercher les requêtes récentes conservées dans le cache.

21
borjab

J'ai trouvé une solution facile

Étape 1. se connecter à la base de données avec un utilisateur admin utilisant PLSQL ou sqldeveloper ou toute autre interface de requête

Étape 2. lancez le script ci-dessous; dans la colonne S.SQL_TEXT, vous verrez les requêtes exécutées

SELECT            
 S.LAST_ACTIVE_TIME,     
 S.MODULE,
 S.SQL_FULLTEXT, 
 S.SQL_PROFILE,
 S.EXECUTIONS,
 S.LAST_LOAD_TIME,
 S.PARSING_USER_ID,
 S.SERVICE                                                                       
FROM
 SYS.V_$SQL S, 
 SYS.ALL_USERS U
WHERE
 S.PARSING_USER_ID=U.USER_ID 
 AND UPPER(U.USERNAME) IN ('Oracle user name here')   
ORDER BY TO_DATE(S.LAST_LOAD_TIME, 'YYYY-MM-DD/HH24:MI:SS') desc;

Le seul problème avec cela est que je ne peux pas trouver un moyen d'afficher les valeurs des paramètres d'entrée (pour les appels de fonction), mais au moins nous pouvons voir ce qui est exécuté dans Oracle et son ordre sans utiliser d'outil spécifique.

15
sergiu
alter system set timed_statistics=true

--ou 

alter session set timed_statistics=true --if want to trace your own session

- doit être assez grand:

select value from v$parameter p
where name='max_dump_file_size' 

- Découvrez le sid et le numéro de série de la session qui vous intéresse:

 select sid, serial# from v$session
 where ...your_search_params...

--vous pouvez commencer le traçage avec l'événement 10046, le quatrième paramètre définit le niveau de trace (12 est le plus grand):

 begin
    sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
 end;

- désactiver le traçage avec réglage du niveau zéro:

begin
   sys.dbms_system.set_ev(sid, serial#, 10046, 0, '');
end;

/ * niveaux possibles: 0 - désactivé 1 - niveau minimal. Tout comme set sql_trace = true 4 - des variables de liaison sont ajoutées au fichier de trace 8 - des attentes sont ajoutées 12 - les deux valeurs de variable de liaison et les événements d'attente sont ajoutés * /

--same si vous voulez suivre votre propre session avec un plus grand niveau:

alter session set events '10046 trace name context forever, level 12';

--éteindre:

alter session set events '10046 trace name context off';

--file avec l'information de trace brute sera localisé:

 select value from v$parameter p
 where name='user_dump_dest'

--name du fichier (*. trc) contiendra spid:

 select p.spid from v$session s, v$process p
 where s.paddr=p.addr
 and ...your_search_params...

--Vous pouvez également définir le nom vous-même:

alter session set tracefile_identifier='UniqueString'; 

--finally, utilisez TKPROF pour rendre le fichier de trace plus lisible:

C:\Oracle\admin\databaseSID\udump>
C:\Oracle\admin\databaseSID\udump>tkprof my_trace_file.trc output=my_file.prf
TKPROF: Release 9.2.0.1.0 - Production on Wed Sep 22 18:05:00 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
C:\Oracle\admin\databaseSID\udump>

--pour voir l'état d'utilisation du fichier de trace:

set serveroutput on size 30000;
declare
  ALevel binary_integer;
begin
  SYS.DBMS_SYSTEM.Read_Ev(10046, ALevel);
  if ALevel = 0 then
    DBMS_OUTPUT.Put_Line('sql_trace is off');
  else
    DBMS_OUTPUT.Put_Line('sql_trace is on');
  end if;
end;
/

Juste un peu traduit http://www.sql.ru/faq/faq_topic.aspx?fid=389 Original est plus complet, mais de toute façon c'est meilleur que ce que d'autres ont posté à mon humble avis

14
q3kep

Essayez PL/SQL Developer car il dispose d’une interface graphique conviviale avec le profileur. C'est joli Nice, essayez le procès. Je jure par cet outil lorsque je travaille sur des bases de données Oracle.

http://www.allroundautomations.com/plsqldev.html?gclid=CM6pz8e04p0CFQjyDAodNXqPDw

5
Kuberchaun

GI Oracle Profiler v1.2

Il s’agit d’un outil pour Oracle permettant de capturer des requêtes exécutées de manière similaire à SQL Server Profiler. Outil indispensable pour la maintenance des applications utilisant ce serveur de base de données. 

vous pouvez le télécharger sur le site officiel iacosoft.com

4
pio

Vu que je viens de voter une question récente comme un duplicata et indiqué dans cette direction. . .

Quelques autres - en SQL * Plus - SET AUTOTRACE ON - donneront un plan explicite et des statistiques pour chaque instruction exécutée.

TOAD permet également le profilage côté client.

L'inconvénient de ces deux méthodes est qu'elles ne vous indiquent que le plan d'exécution de l'instruction, mais pas la manière dont l'optimiseur est arrivé à ce plan - pour cela, vous aurez besoin d'un traçage côté serveur inférieur.

Les instantanés de Statspack sont un autre élément important à comprendre. Ils constituent un bon moyen d’analyser les performances de la base de données dans son ensemble. Le plan d’explication, etc., permet de trouver des instructions SQL individuelles constituant des goulots d’étranglement. Statspack sait bien que votre problème est qu’une simple déclaration avec un bon plan d’exécution est appelée 1 million de fois en une minute.

4
JulesLt

essayez ceci (c'est également gratuit): http://www.aboves.com/Statement_Tracer_for_Oracle.exe

2
Babba

La capture est une capture de tous les SQL exécutés entre deux instants. Comme le fait SQL Server.

Dans certaines situations, il est utile de capturer le code SQL qu'un utilisateur particulier exécute dans la base de données. Habituellement, vous activerez simplement le suivi de session pour cet utilisateur, mais cette approche présente deux problèmes potentiels.

  1. La première est que de nombreuses applications Web conservent un pool de connexions de base de données persistantes partagées entre plusieurs utilisateurs. 
  2. La seconde est que certaines applications se connectent, exécutent du code SQL et se déconnectent très rapidement, ce qui rend difficile l'activation du traçage de session (vous pouvez bien sûr utiliser un déclencheur de connexion pour activer le traçage de session dans ce cas).

Une solution simple et rapide au problème consiste à capturer toutes les instructions SQL exécutées entre deux instants.

La procédure suivante créera deux tables, chacune contenant un instantané de la base de données à un moment donné. Les tables seront ensuite interrogées pour produire une liste de tous les SQL exécutés au cours de cette période.

Si possible, utilisez un système de développement silencieux, sinon vous risquez de récupérer trop de données.

  1. Prenez le premier instantané Exécutez le SQL suivant pour créer le premier instantané:

    create table sql_exec_before as
    select executions,hash_value
    from v$sqlarea
    /
    
  2. Demandez à l'utilisateur d'effectuer sa tâche dans l'application.

  3. Prenez le deuxième instantané.

    create table sql_exec_after as
    select executions, hash_value
    from v$sqlarea
    /
    
  4. Vérifiez les résultats Maintenant que vous avez capturé le code SQL, il est temps d'interroger les résultats.

Cette première requête listera tous les hachages de requêtes exécutés:

select  aft.hash_value
from sql_exec_after aft
left outer join sql_exec_before bef
  on aft.hash_value  =  bef.hash_value 
where aft.executions > bef.executions
   or bef.executions is null;
/

Celui-ci affichera le hachage et le code SQL lui-même: Set pages 999 lignes 100 Break on hash_value

select  hash_value, sql_text
from    v$sqltext
where   hash_value in (
    select  aft.hash_value
    from sql_exec_after aft
    left outer join sql_exec_before bef
      on aft.hash_value  =  bef.hash_value
    where aft.executions > bef.executions
       or bef.executions is null;
)
order by
    hash_value, piece
/

5 . Ranger N'oubliez pas de supprimer les tables d'instantanés une fois que vous avez terminé:

drop table sql_exec_before
/

drop table sql_exec_after
/
2
JaMeEL

Il existe un outil commercial FlexTracer qui peut être utilisé pour suivre les requêtes Oracle SQL

1
user449251

Oracle, ainsi que d'autres bases de données, analyse une requête donnée pour créer un plan d'exécution. Ce plan est le moyen le plus efficace de récupérer les données.

Oracle fournit l'instruction 'explain plan' qui analyse la requête mais ne l'exécute pas, mais remplit une table spéciale que vous pouvez interroger (la table de plan).

La syntaxe (version simple, il existe d'autres options telles que marquer les lignes dans la table de plan avec un ID spécial ou utiliser une table de plan différente) est la suivante:

explain plan for <sql query>

L'analyse de ces données est laissée à une autre question, ou à vos recherches ultérieures.

1
paxdiablo

Ceci est une documentation Oracle expliquant comment tracer des requêtes SQL, y compris quelques outils (SQL Trace et tkprof)

lien

0
Code Trawler

Apparemment, il n'y a pas de petit utilitaire simple et peu coûteux qui aiderait à accomplir cette tâche. Il existe cependant 101 façons de le faire de manière compliquée et peu pratique.

L'article suivant en décrit plusieurs. Il en existe probablement des dizaines d'autres ... http://www.petefinnigan.com/ramblings/how_to_set_trace.htm

0