背景質問:Oracle Databaseの顧客の反応が非常に遅い非常に遅い(他のセッションによるリードは、DBファイルのシーケンシャル読み込み待機イベントと組み合わせることができる最適化)されます
1イベントを待って確認します。
セットLINESIZE 200
A15のためにコルユーザ名
A35のためにコルイベント
A20用COLプログラム
99.99のためのコルcpu_p
、(選択s.username、s.program、s.event、s.sql_id、和(TRUNC(m.cpu))CPU_TIMEからTA *、ラウンド(ta.cpu_time / tb.total_cpu * 100、1)cpu_usageを選択V sessmetricメートルを$ V $セッションS(m.physical_reads> 100または> 100 m.cpu> 100またはm.logical_reads)とm.session_id = s.sidとm.session_serial_num = sから(*)の合計を数えます。 V $ sessmetricからシリアル番号とs.status = 'ACTIVE' とユーザ名がs.username、s.program、s.event、5 DESCによってs.sql_id順でヌルグループではありません)TA、(選択合計(CPU)total_cpu )TBここでROWNUM <11。
イベントを選択し、2 DESCにより、イベントの順序によって、V $ SESSION_WAITのグループから(1)を数えます。
最初に見つかった行は、他のセッションによって読み取ります。
2探してSQLの他のセッションで読み取り、同時にあなたは、AWRレポートTOP SQL、同じSQLへのすべてのポイントを見てみることができます。
SIDを選択し、
s.username、
s.program、
s.action、
LOGON_TIME、
q.sql_text、
q.SQL_FULLTEXT、
q.sql_id
V $セッションSから
左s.sql_hash_value = q.hash_valueにV $ SQLに関するQに参加
(選択SIDにどこをs.sid
V $ SESSION_WAITから
ここで、(「他のセッションによって読み取ら」)内のイベント)。
3、SQLの実装について、SQLは、実施計画を確認することです。
しかし、SQLは明らかに間違ったインデックスを行っています。
SELECT COUNT(*)PAGENOとして
TABLE1から
TARGETID =: "SYS_B_0"
そして、MSGIDで
( "SYS_B_1" はuserId =表2からMSGIDを選択)
(: "SYS_B_2"、 "SYS_B_3"、 "SYS_B_4")とクラス名ではありませんで
および日時
正確ではありません4、間違った実行計画は、表統計に可能性があります。お問い合わせの際に、それは実際に表2の正確な統計はありません。統計情報を収集したり、問題を解決するためのヒントを追加します。
DBMS_STATS.GATHER_TABLE_STATSを実行スキーマ(ownname => '所有者'、tabnameの=>
'表2'、ESTIMATE_PERCENT =>
DBMS_STATS.AUTO_SAMPLE_SIZE、METHOD_OPT =>「FOR ALL COLUMNSのサイズ
AUTO」、カスケード=> TRUE);
備考:
実際にOracleのIOは、この操作でメモリにディスク上のデータ・ブロックの間に(キャッシュバッファのデータ)を、より一般的なシナリオ、セッションを発行し、このイベントのために待機している他のセッションでは読み取り、
セッションB、Cは、セッションのブロックを要求します。さらに、セッションは完全にメモリ(データバッファキャッシュ)に読み込まれているので、Bを導いた、他のセッションによって読み取らcは。セッションは、DBファイルのシーケンシャル読み込みまたはDBファイルが読み込ま散在通常です。
それはまた、熱質量現象です。
この問題を解決する方法がある場合は?
この問題は通常、ため、SQL原因で発生する、またはディスクデバイスが原因となりますので。
あなたが最初のSQLを検索する必要があるときに問題が発生した場合。
方法の一つ:きめの細かい火山灰によって得られた報告書では、トップSQL文のSQLを見ることを得ます。
方法2:SQL文の直接アクセス:
1、現在の問題が発生しています:
'他のセッションで読む' V $ SQL、V $セッションB a.sql_id = b.sql_idとb.event =からsql_fulltextを選択します。
2、歴史が発生しました
'他のセッションによるリード' V $ SQL、DBA_HIST_ACTIVE_SESS_HISTORY B a.sql_id = b.sql_idとb.event =からsql_fulltext、a.sql_idを選択します。
多くの場合、DBファイルのシーケンシャル読み込みイベントの出現で、他のセッションで読み取ります。
また、あなたは情報が関係するオブジェクトを表示することができ、ここではP1、P2、P3であります
SELECT P1 "ファイル#"、P2 "ブロック#"、P3 "クラス#"
イベントは=「他のセッションによって読み取ら」五$ SESSION_WAIT FROM;
P1、P2、P3 GETホットオブジェクトによって:
SELECT RELATIVE_FNO、所有者、SEGMENT_NAME、DBA_EXTENTS FROMのsegment_type
WHERE FILE_ID =&ファイル
AND&BLOCK_IDとBLOCK_ID +ブロック間のブロック - 1;
さらに、情報は、ホットSQL文を得られるブロック図として、直接ホットブロックを見ることができます。
SQL_TEXTを選択
SQLTEXTのV $から、
(別個a.owner、a.segment_name、a.segment_typeを選択
DBA_EXTENTSから、
(選択dbarfil、dbablk
(選択dbarfil、TCH DESCによるX $ BH順からdbablk)から
ROWNUM <11)、B
どこa.RELATIVE_FNO = b.dbarfil
そしてa.BLOCK_ID <= b.dbablk
そしてa.block_id + a.blocks> b.dbablk)B
どこa.sql_text LIKE '%' || b.segment_name || '%'
そしてb.segment_type = 'TABLE'
a.hash_value、a.address、a.pieceによって順番。
ホットブロックオブジェクトを参照してください。
SELECT E.OWNER、E.SEGMENT_NAME、E.SEGMENT_TYPE
DBA_EXTENTS E FROM、
(SELECT *
SELECT ADDR、TS#、FILE番号、DBARFIL、DBABLK、TCH(FROM
X $ BH FROM
ORDER BY DESC TCH)
ROWNUM <11)、B
WHERE E.RELATIVE_FNO = B.DBARFIL
AND E.BLOCK_ID <= B.DBABLK
AND E.BLOCK_ID + E.BLOCKS> B.DBABLK。
ISを行うために、SQLの必要性を発見した後に問題がある、と最適化を決定するために実行計画を表示します。
1、表から番組を選択・表示するには、次のコマンドによって行うことができるカーソルの存在のために、共有プール内(dbms_xplan.display_cursor(「SQL_ID」、NULLを、「allstats」));
図2に示すように、履歴情報にAWR見ることによって得ることができる:表SELECT * FROM(dbms_xplan.display_awr( 'SQL_IDを'));
ディスクの読み取りおよび書き込み情報にデバイスを表示する必要があることに加えて、それがvmstatの2 200によって決定することができます。