sql >> データベース >  >> RDS >> Oracle

リレーショナルデータベースでパフォーマンスの問題を説明するにはどうすればよいですか?

    Oracleデータベースの場合 この情報を提供してください:

    問題の症状を説明してください

    問題の原因となる動作を説明してください。クエリの動作は安定していますか、それとも特定のパラメータまたは単純ランダムで問題が発生するのはたまにしかありませんか。この動作をIDE(SQL Developerなど)で再現できますか?

    環境を説明する

    Oracleの正確なバージョンを定義する

     select * from v$version
    

    データベースへの接続方法を説明してください:ドライバー、ORM、プログラミング言語。名前やバージョン番号を入力してください。

    クエリを説明する

    クエリテキストを投稿します。単純化してみてください-最小限の再現可能な例を示してください 。

    例-問題のあるクエリが10個のテーブルを結合します。結合が9または8のクエリで同じ症状が見られるかどうかを確認します。問題が表示されるまでステップダウンし、削減されたクエリのみを表示します。

    はい、これには費用がかかりますが、サポートを受ける可能性が非常に高くなります! クエリが小さいほど、サポーターを引き付けます。

    実行計画を説明する

    実行プランを取得するには、このステートメントを実行します(クエリテキストに置き換えます)

     EXPLAIN PLAN  SET STATEMENT_ID = '<some_id>' into   plan_table  FOR
         select * from ....   -- your query here 
     ;
    

    実行プランはPLAN_TABLEに保存されます 、このクエリを実行することを確認するには

     SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', '<some_id>','ALL')); 
    

    完全な結果を表示する (実行プランの表だけでなく)非常に重要なのは、述語セクションと以下の注記です。

    select * from dual where dummy = :1;の例

    Plan hash value: 272002086
    
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    
    Query Block Name / Object Alias (identified by operation id):
    -------------------------------------------------------------
    
       1 - SEL$1 / [email protected]$1
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - filter("DUMMY"=:1)
    
    Column Projection Information (identified by operation id):
    -----------------------------------------------------------
    
       1 - "DUMMY"[VARCHAR2,1]
    

    グラフィカルな結果を切り取って貼り付けないでください IDEの説明プラン。

    この実行プランは実際に実行されるプランですか?

    残念ながら、常にではありません。 説明にはいくつかの理由があります 実行計画は実際の計画とは異なる場合があります。

    疑問がある場合(特に、適切なプランが表示されているが、クエリが正しく実行されない場合)、SQL_IDを提供するDBキャッシュからプランを抽出できます。 。

     SELECT t.* FROM  table(DBMS_XPLAN.DISPLAY_CURSOR('<SQL_ID>',null,'ALL')) t; 
    

    現在実行中の(または間もなく実行されていて、まだキャッシュされている)クエリのSQL_IDは、テキスト一致および/またはデータベースユーザーで見つけることができます:

    select sql_id, sql_fulltext from v$sql a where 
     lower(sql_text) like lower('%<some identifying part of the query text>%') 
      and parsing_schema_name = '<user running the query>';
    

    AWRライセンスをお持ちの場合は、履歴で実行されているクエリであっても、そこから実行プランを取得できます。

    SELECT t.*
    FROM  table(DBMS_XPLAN.DISPLAY_AWR('10u2rj016s96k'  )) t;
    

    SQL_IDは、

    を使用して見つけることができます。
    select sql_id, sql_text 
    from dba_hist_sqltext a 
    where lower(sql_text) like lower('%<some identifying part of the query text>%')
    

    データを説明する

    テーブルのDDLとそれらのテーブルのインデックスを表示します。

    オプティマイザの統計が最近収集されたかどうかに言及し、使用されたdbms_statsを表示します ステートメントを収集します。

    重要なテーブルについては、セグメントサイズ、行番号、パーティション化などに関する情報を提供します...

    アクセスまたは結合で使用される列について、個別の値の数に関する情報を提供します。値は均等に分散または偏っていますか(たとえば、非常に頻繁に発生する少数の値と多数のまれな値)ヒストグラムを定義しますか?

    他に何かありますか?

    もちろん、これは基本的なことであり、システム統計やオプティマイザパラメータなど、その他の情報が必要になる場合があります。ただし、問題を特定できる最小限の情報を提供するようにしてください。要求に応じて追加情報を投稿してください。

    幸運を!




    1. Postgres UTC日付形式とエポックキャスト、符号反転

    2. OracleでAUTO_INCREMENTを使用してIDを作成するにはどうすればよいですか?

    3. SQLiteデータベースへのアクティビティとバックグラウンドサービスのアクセス

    4. SQLiteデータベースのリークが見つかりました