0

Oracle Version: 11.1.0.7.0

OracleRACインスタンスの1つでIO待機が高くなっています

1つのSQLの実行による経過時間は長く、実行ごとに1452.57秒です。これはある日突然起こり始めました。以前は、20k(:v4パラメーター)レコードを照会するのに最大3〜4分かかりました

subscribeinfoレコード:5900万(非並列)

チャージレートレコード:2k-3k

SQLは以下のとおりです

o.msisdn、o.spid、o.serviceid、o.ChargeReferenceID、o.channelID、o.nextchargetime、o.failtimestamp、o.lastmonfeeday、o.networkId、o.retryEndDateTime、o.trialType、o.subFlag、oを選択します.faultCode from subscribeinfo o、chargerate r where(o.monthbillid =:v1)and(((o.state =: "SYS_B_00")and(o.nextchargetime <:v2)and((o.IsAutoExtend <>: "SYS_B_01 ")または((o.IsAutoExtend =:" SYS_B_02 ")and(o.extendflag <>:" SYS_B_03 "))))または(o.subFlag =:" SYS_B_04 "and o.state =:" SYS_B_05 "and o .retryenddatetime>:v2))and(o.ChargeClassForSub = r.chargeclassidx)and((r.chargemode =: "SYS_B_06" and r.activetype =: "SYS_B_07" and o.nextchargetime!=: "SYS_B_08")または( r.chargemode =:"SYS_B_09"およびr.activetype<>:"SYS_B_10")または(r.chargemode> =: "SYS_B_11" and r.chargemode <=: "SYS_B_12" and r.basecharge> =: "SYS_B_13")または(r.chargemode =: "SYS_B_14")または(r .chargemode =: "SYS_B_15")または(r.chargemode =: "SYS_B_16"))および(o.failtimestamp <=:v3)および(rownum <=:v4)

AWRレポートによるとトップ5の時限フォアグラウンドイベント

ダイレクトパス読み取り[平均待機時間:22秒、%DB時間:50.75%] DBファイルシーケンシャル読み取り[平均待機時間:15秒、%DB時間:38.00]

制限があるため、完全なAWRレポートを投稿することはできません。だから私が投稿する詳細を聞いてください

以下の説明プランをご覧ください。

ID Exec Ord Operation Go To More Peek Bind Capt Bind Cost2 Estim Card LAST Starts LAST Output Rows LAST Over / Under Estimate1 PStart PStop Work Area 0 7 SELECT STATEMENT
23335 1 2577 1 6 COUNT STOPKEY [+] [+]
[+] 23335 1 257725。ハッシュ結合[+][+]
[+] 23335 20001 125778xオーバー[+]31..テーブルアクセスフルチャージ[+][+]68 3035 1 3036 1x 44..パーティションリストシングル[+]23266.. 25223 1 2577 10x over KEY KEY 53...ローカルインデックスによるテーブルアクセスROWIDSUBSCRIBEINFO[+] [+] [+]
[+] 23266 25223 1 2577 10x over KEY KEY 62....インデックス範囲スキャンIDX_FAILTIMESTAMP_NEW[+][+] [+] [+] 243512100765キーキー

IOSTAT

Linux 2.6.16.46-0.12-smp(mdspdb01)11/16/12

avg-cpu:%user%nice%system%iowait%steal%idle

       8.41    0.00    9.38   13.25    0.00   67.67

デバイス:tps Blk_read / s Blk_wrtn / s Blk_read Blk_wrtn

sda 5.71 39.53 121.79 665679995 2051190222

sdb 85.75 178.15 171.12 3000316741 2881953582

sdc 111.05 161.69 43.96 2723201251 740429949


monthbillid、nextchargetime、failtimestampの各フィールドのインデックスを作成しました...これにより、カーディナリティが1/6に大幅に向上しましたが、コストが4〜5倍に増加しました。ただし、Oracleはデフォルトで新しいインデックスを取得します

subscribeinfo(monthbillid、nextchargetime、failtimestamp)ローカルテーブルスペースIMUSE_INDEXにインデックスIDX_MONTHBILLQUERYを作成します。

dbms_stats.gather_index_stats('IMUSE01'、'IDX_MONTHBILLQUERY');

AWRレポートにはハード解析=0があります。また、cursor_sharing=FORCEを変更しました

現在、IOは制御下にあります。まだ感じていますが、これは根本的な原因ではありません。また、インスタンスをこのクエリ専用にしました。これは1時間に10回以上発生し、2万件のレコードを取得するのに約100秒かかります。

オプティマイザーモードをfirst_rowsとして使用するか、ヒントfirst_rows(20000)を使用するかを選択するのが適切かどうか、誰かが提案できますか。

現在、統計ジョブを無効にしていますが、一部のテーブルまたは一部のインデックスに対してのみ同じことを有効にできますか?これは可能ですか?

4

2 に答える 2

0

問題は解決しました..... cursor_sharing が強制的に作成されました... これにより、IO が大幅に削減されました。これで、すべてのインスタンスで IO が正常になりました。次に、同じクエリに対して 2 つのインデックスを作成しました。これは、sqltuning advisor によって推奨され、プロファイルを受け入れました。

2- SQL プロファイルの検索 (以下のプランの説明セクションを参照) -------------------------------------- ------------------ このステートメントに対して、より適切な実行計画が見つかった可能性があります。

推奨 (推定利益: 80.44%)

  • 推奨される SQL プロファイルを受け入れることを検討してください。execute dbms_sqltune.accept_sql_profile(task_name => 'my_sqltune_task1', task_owner => 'IMUSE01', replace => TRUE);

    検証結果 ------------------ SQL プロファイルは、その計画と元の計画の両方を実行し、それぞれの実行統計を測定することによってテストされました。他の計画をより短い時間で完了できる場合、その計画は部分的にしか実行されていない可能性があります。

                       Original Plan  With SQL Profile  % Improved
                       -------------  ----------------  ----------   Completion Status:             PARTIAL          COMPLETE   Elapsed
    

    時間 (ミリ秒): 31479 8049 74.43% CPU 時間 (ミリ秒): 5172 1656 67.98%
    ユーザー I/O 時間 (ミリ秒): 16367 3422 79.09%
    バッファー取得: 265365 51818 80.47%
    ディスク読み取り: 3227 524 83.76%
    直接書き込み: 0 0 行処理: 0 20000 フェッチ:
    0 20000 実行: 0
    1

3- インデックスの検索 (以下のプランの説明セクションを参照) --------------------------------------- ----------- このステートメントの実行計画は、1 つ以上の
インデックスを作成することで改善できます。

推奨 (推定利益: 81.1%)

  • Access Advisor を実行して物理スキーマの設計を改善するか、推奨されるインデックスを作成することを検討してください。IMUSE01.SUBSCRIBEINFO("STATE","SUBFLAG","MONTHBILLID","RETRYENDDATETIME") にインデックス IMUSE01.IDX$$_67E5B0001 を作成します。

  • Access Advisor を実行して物理スキーマの設計を改善するか、推奨されるインデックスを作成することを検討してください。IMUSE01.SUBSCRIBEINFO("STATE","MONTHBILLID","FAILTIMESTAMP") にインデックス IMUSE01.IDX$$_67E5B0002 を作成します。

    根拠 --------- 推奨インデックスを作成すると、このステートメントの実行計画が大幅に改善されます。ただし、単一のステートメントではなく、代表的な SQL ワークロードを使用して「アクセス アドバイザ」を実行する方が望ましい場合があります。これにより、インデックスのメンテナンスのオーバーヘッドと追加のスペース消費を考慮した包括的なインデックスの推奨事項を取得できます。

4- SQL の調査結果を再構築する (プランの説明セクションのプラン 1 を参照) ------------------------------------ ---------------------------- Predicate "O"."NEXTCHARGETIME"<>:B1 は、実行計画の行 ID 5 で使用されます。索引付けされた列「NEXTCHARGETIME」の不等条件。この不等条件により、オプティマイザーはテーブル "IMUSE01"."SUBSCRIBEINFO" のインデックスを効率的に使用できなくなります。

推奨 -------------- - 述語を同等の形式に書き直して、インデックスを利用します。

根拠 --------- 述語が不等条件である場合、またはインデックス付き列に式または暗黙的なデータ型変換がある場合、オプティマイザーはインデックスを使用できません。

于 2012-12-02T03:36:04.213 に答える
0

問題は、ステートメントが 50000 を超えるディスク読み取りを引き起こしていることです。これはおそらく、cursor_sharing を使用したことが原因です。このパラメーターは通常、アプリケーションがバインド変数を使用せずにコーディングされている場合に使用されます (非常に悪いです。そのアプリケーションを修正するには、歩かないでください。実行してください)。おそらく、cursor_sharing を force に設定することさえあります。これは、説明したような望ましくない影響を与える可能性があり、ほとんどの場合、カーソルのピークも機能しません。

必要なテーブルにインデックスがあるかどうかに応じて、ヒントを指定してテーブル全体のスキャンを回避することで、この問題を回避できます。記載がないので、具体的なアドバイスはできません。

于 2012-11-18T18:34:39.387 に答える