Oracle:SQLサーバー用のプロファイラーのようなクエリをトレースするツールはありますか?[閉まっている]


84

SQL Serverを使用していますが、OracleDBを使用するアプリケーションに移行する必要があります。アプリケーションクエリをトレースするために、SQLServerでは素晴らしいプロファイラーツールを使用しています。Oracleに相当するものはありますか?


38
なぜあなたは間違った答えを受け入れたのですか?計画の説明は、プロファイラーが行うことを行いません。それは完全に無関係です。
ジャスミン

1
あなたはのような最高のツールを見つけましたsql server profilerか?今何を使っていますか?
Shahid Ghafoor 2015

Oracleアプリケーションのトレースに関する本を書きました。これは、method-r.comからPDF形式で入手できます。
Cary Millsap 2016

DevartのdbForgeStudio forOracleのOracleプロファイラーを確認してください。
Devart 2018

以下に多くの回答がありますが、奇妙なことに、PL / SQL用のOracleの2つのプロファイラーDBMS_PROFILER(基本的で制限されていますが、非常に便利です)またはDBMS_HPROF(より正確ですが、より多くのセットアップが必要です)のどちらにも言及していません。ただし、SQL Serverについては知らないため、どちらのOracleパッケージとも異なるプロファイリングの概念があり、必要なのはOracleでのトレースのようなものである可能性があります。
ウィリアムロバートソン

回答:


22

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

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

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

他の方法があります。Enterprise Managerは、ここに記載されているような特別なビューですでに利用可能なものをきれいな色で表示します:http//www.oracle.com/pls/db92/db92.catalog_views?remark = homepage

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


17

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

ステップ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で実行される内容とその順序を確認できます。


2
クエリテキストが1000文字を超える場合は、SQL_TEXTがその時点で切り捨てられるため、S.SQL_FULLTEXTを追加できます。
Tridus 2016

2
LAST_ACTIVE_TIMEはVARCHAR2(19)であるため、注文しないでください。代わりにこれを使用してください:ORDER BY TO_DATE(S.LAST_LOAD_TIME、 'YYYY-MM-DD / HH24:MI:SS')desc
Igor Krupitsky 2017

1
ORA-00942:表またはビューが存在しません00942。00000- "表またはビューが存在しません" *原因:*アクション:行:11列:6でエラーが発生しました。これは、管理者権限がないことを意味しますか?
toha

これにはパラメータ値は含まれません。それも必要な場合は、stackoverflow.com
a / 14217618/6339469

16
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とserial#を調べます。

 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オリジナルはより充実していますが、とにかくこれは他の人が私見に投稿したものよりも優れています


他の答えよりもはるかに便利です!
Andomar 2015年

複雑すぎる。誰もそれを使うつもりはありません。
ADM-IT

7

GI Oracle Profiler v1.2

これは、SQLServerプロファイラーと同様に実行されたクエリをキャプチャするためのOracle用のツールです。このデータベースサーバーを使用するアプリケーションのメンテナンスに欠かせないツールです。

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


こんにちは。このソフトウェアを使用するには、ORACLEからの特別なライセンスが必要ですか?オラクルでは、特定のテーブル/ビューを対話することができます。それを実行し、ライセンスを持っていない場合は、追加料金が発生します。
sergiu 2014

2
こんにちは、v $ sqlareaをクエリするために支払う必要がありますか?何を言っているリンクを入力できますか?
pio 2014

優秀なありがとう男!!! あなたは私に多くの仕事を節約します
Hernaldo Gonzalez 2015

クエリが失敗した場合、プロファイラーには表示されません。
ADM-IT


5

私が最近の質問を重複として投票し、この方向を指し示したのを見て。。。

さらに、SQL * PlusのSETAUTOTRACE ONで、実行された各ステートメントの計画と統計について説明します。

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

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

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


3

キャッチは、2つの時点の間で実行されるすべてのSQLをキャプチャします。SQLServerもそうです。

特定のユーザーがデータベースで実行している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自体を表示します:set pages 999 lines 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.片付け終了したら、スナップショットテーブルを削除することを忘れないでください。

drop table sql_exec_before
/

drop table sql_exec_after
/

テクニックを示す完全なスクリプトをありがとうございます。
Roman Pokrovskij 2014

2

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

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

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

explain plan for <sql query>

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




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.