2016-04-29 8 views
0

私は本当に長い(約3分)かかるSQL SELECT文を持っています。SQL実行時間を調べる方法

私は何が起こっているのか調べたいと思います。だから私はした

explain plan for MY_STATEMENTしかし、これは< 1秒で終了します。

SELECT * FROM TABLE (dbms_xplan.display);は私

| Id | Operation    | Name     | Rows | Bytes | Cost (%CPU)| Time  | Inst |IN-OUT|                                               
------------------------------------------------------------------------------------------------------------------                                               
| 0 | SELECT STATEMENT  |       | 943 | 86756 | 15 (0)| 00:00:01 |  |  |                                               
|* 1 | HASH JOIN RIGHT OUTER |       | 943 | 86756 | 15 (0)| 00:00:01 |  |  |                                               
| 2 | TABLE ACCESS FULL | PTSAREA     | 442 | 12376 |  5 (0)| 00:00:01 |  |  |                                               
|* 3 | HASH JOIN RIGHT OUTER|       | 943 | 60352 | 10 (0)| 00:00:01 |  |  |                                               
| 4 | TABLE ACCESS FULL | PTSAREA     | 442 | 12376 |  5 (0)| 00:00:01 |  |  |                                               
| 5 | REMOTE    | M_SUPP     | 943 | 33948 |  5 (0)| 00:00:01 | IXXX_~ | R->S |                                               
------------------------------------------------------------------------------------------------------------------ 


suspicous何も言っていない。しかし、私は本当になステートメントを実行したときには〜3分かかります。何がそんなに長くかかるかを知る方法はありますか?

+2

質問を編集し、クエリを含めます。実際には、私はむしろ質問そのものに混乱しています。あなたは 'explain'計画を持っています。クエリがどのように実行されているか、そしてそれには一定の時間がかかる理由に関する情報が提供されます。 –

+0

本番環境で長時間実行されている場合は、CPU時間を消費している可能性がありますか? –

+0

ここに情報が表示されますか?時間:00:00:01で、コストはかなり低いと言います – matthias

答えて

1

まず、をチェックして、オプティマイザがそのような低コストと経過時間を推定する理由を確認してください。

最も可能性の高い原因は、間違ったまたは古いオブジェクト統計です。 PTSAREAM_SUPPの行数を確認します。 実際には442件しかありません。 943行?私はマグニチュードの高いボリュームを疑う。

この場合、表の統計情報を収集して、Explain計画を繰り返します。あなたは多くの現実的なコストと時間を見なければなりません。 場合によっては、異なる実行計画を発生させることがあります。

つまり、実行計画で予期しないことが発生した場合、これはオプティマイザの入力(オブジェクト統計、システム統計およびオプティマイザパラメータ)の問題です。

+0

@matthias:テーブルの統計情報を収集するには、 'BEGIN DBMS_STATS.GATHER_TABLE_STATS(ownname => 'schema'、tabname => 'table name')のようなものを使用します。このコードの明白な場所にテーブルのスキーマと名前を入れます。クエリで使用される各テーブルに対してこれを実行し、次に実行計画を再度取得し、クエリを再度実行し、現在の場所を確認します。運が良かった。 –

関連する問題