web-dev-qa-db-ja.com

Oracle:SQL Serverのプロファイラーのようなクエリをトレースするツールはありますか?

sQLサーバーを使用していますが、Oracle DBを使用するアプリケーションに移行する必要があります。アプリケーションクエリをトレースするには、Sql ServerですばらしいProfilerツールを使用します。 Oracleに相当するものはありますか?

77
stefano m

Oracle Enterprise Managerを使用して、実行中の問合せ、その実行計画、ロック、一部の統計、さらに長いタスクの進行状況バーまで、アクティブなセッションを監視できます。

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

[インスタンス]-> [セッション]に移動し、各セッションの[SQL]タブを確認します。

他の方法があります。エンタープライズマネージャーは、ここに記載されているようなスペシャルビューですでに利用可能なものをきれいな色で配置します。 http://www.Oracle.com/pls/db92/db92.catalog_views?remark=homepage

そして、もちろん、EXPLAIN PLAN FOR、TRACEツール、および他の多くの手段の使用も使用できます。エンタープライズマネージャーには、最も高価なSQLクエリに関するレポートがいくつかあります。キャッシュに保存されている最近のクエリを検索することもできます。

22
borjab

簡単な解決策を見つけました

ステップ1。 PLSQLまたはsqldeveloperまたはその他のクエリインターフェイスを使用して、管理ユーザーでDBに接続する

ステップ2。以下のスクリプトを実行します。 S.SQL_TEXT列には、実行されたクエリが表示されます

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;

これに関する唯一の問題は、(関数呼び出しの)入力パラメーター値を表示する方法が見つからないことですが、少なくとも特定のツールを使用せずにOracleで実行されているものとその順序を確認できます。

16
sergiu
alter system set timed_statistics=true

- または

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

-十分に大きくなければなりません:

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

-興味のあるセッションのsidとシリアル番号を確認します。

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

-10046イベントでトレースを開始できます。4番目のパラメーターはトレースレベルを設定します(12が最大です)。

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

-レベルをゼロに設定してトレースをオフにします。

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

/ *可能なレベル:0-オフ1-最小レベル。 set sql_trace = trueと同様4-バインド変数値がトレースファイルに追加8-待機が追加12-バインド変数値と待機イベントの両方が追加* /

-より大きなレベルで独自のセッションをトレースする場合も同じです。

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

- 消す:

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

-生のトレース情報を含むファイルが配置されます。

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

-ファイル名(* .trc)にはspidが含まれます。

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

-また、自分で名前を設定できます:

alter session set tracefile_identifier='UniqueString'; 

-最後に、TKPROFを使用して、トレースファイルを読みやすくします。

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>

-トレースファイルの使用状態を表示するには:

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;
/

翻訳された http://www.sql.ru/faq/faq_topic.aspx?fid=389

15
q3kep

GI Oracle Profiler v1.2

これは、SQL Server Profilerと同様に実行されるクエリをキャプチャするOracle用のツールです。このデータベースサーバーを使用するアプリケーションのメンテナンスに不可欠なツール。

公式サイトiacosoft.comからダウンロードできます

6
pio

PL/SQL Developerをお試しください。プロファイラーへのユーザーフレンドリーなGUIインターフェースがあります。トライアルを試してみるのはかなりいいです。 Oracleデータベースで作業するときは、このツールに誓います。

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

6
Kuberchaun

私が最近の質問を複製として投票し、この方向を指摘したように見えます。 。 。

さらにいくつか-SQL * Plusで-SET AUTOTRACE ON-実行された各ステートメントの説明計画と統計を提供します。

TOADでは、クライアント側のプロファイリングも可能です。

これらの両方の欠点は、ステートメントの実行計画のみを伝え、オプティマイザーがその計画に到達した方法を伝えないことです。そのためには、低レベルのサーバー側トレースが必要です。

理解しておくべきもう1つの重要なものは、Statspackスナップショットです。これらは、データベース全体のパフォーマンスを確認するのに適した方法です。 EXPLAIN PLANなどは、ボトルネックとなっている個々のSQL文を見つけるのに適しています。 Statspackは、問題が、優れた実行計画を持つ単純なステートメントが1分間に100万回呼び出されているという事実を識別するのに優れています。

5
JulesLt

キャッチは、2つのポイント間のすべてのSQL実行をキャプチャします。 SQL Serverも同様です。

特定のユーザーがデータベースで実行しているSQLをキャプチャすると便利な場合があります。通常、そのユーザーに対してセッショントレースを有効にするだけですが、そのアプローチには2つの潜在的な問題があります。

  1. 1つ目は、多くのWebベースのアプリケーションが、複数のユーザー間で共有される永続的なデータベース接続のプールを維持していることです。
  2. 2番目は、一部のアプリケーションが接続し、一部のSQLを実行し、非常に迅速に切断するため、セッショントレースをまったく有効にするのが難しいことです(もちろん、この場合セッショントレースを有効にするためにログオントリガーを使用できます)。

この問題に対する迅速で汚い解決策は、2つの時点の間で実行されるすべてのSQLステートメントをキャプチャすることです。

次の手順では、特定の時点でのデータベースのスナップショットを含む2つのテーブルを作成します。その後、テーブルがクエリされ、その期間中に実行されたすべてのSQLのリストが生成されます。

可能であれば、静かな開発システムでこれを行う必要があります。そうしないと、大量のデータを取り戻すリスクがあります。

  1. 最初のスナップショットを取得する次のSQLを実行して、最初のスナップショットを作成します。

    create table sql_exec_before as
    select executions,hash_value
    from v$sqlarea
    /
    
  2. ユーザーにアプリケーション内でタスクを実行させる。

  3. 2番目のスナップショットを撮ります。

    create table sql_exec_after as
    select executions, hash_value
    from v$sqlarea
    /
    
  4. 結果を確認するSQLをキャプチャしたら、結果を照会します。

この最初のクエリは、実行されたすべてのクエリハッシュをリストします。

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;
/

これは、ハッシュとSQL自体を表示します:設定ページ999行100 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.片付け終了したら、スナップショットテーブルを削除することを忘れないでください。

drop table sql_exec_before
/

drop table sql_exec_after
/
3
JaMeEL

これを試してください(無料です): http://www.aboves.com/Statement_Tracer_for_Oracle.exe

2
Babba

Oracle SQLクエリをトレースするために使用できる商用ツール FlexTracer があります

2
user449251

Oracleは、他のデータベースとともに、指定されたクエリを分析して実行プランを作成します。この計画は、データを取得する最も効率的な方法です。

Oracleは 'explain plan 'クエリを分析しますが、実行はせず、代わりにクエリ可能な特別なテーブル(プランテーブル)を設定するステートメント。

構文(シンプルバージョン、プランテーブルの行に特別なIDを付ける、または別のプランテーブルを使用するなどの他のオプションがあります)は次のとおりです。

explain plan for <sql query>

そのデータの分析は、別の質問、またはあなたのさらなる研究のために残されています。

2
paxdiablo

これは、いくつかのツール(SQL Traceとtkprof)を含むSQLクエリをトレースする方法を説明するOracleドキュメントです。

リンク

1
Code Trawler

どうやらこのタスクを実行するのに役立つ小さなシンプルで安価なユーティリティはありません。しかし、複雑で不便な方法でそれを行う101の方法があります。

次の記事でいくつか説明します。おそらくもっとたくさんあります... http://www.petefinnigan.com/ramblings/how_to_set_trace.htm