SQLのパフォーマンスチューニングを行うには実行計画と統計情報を確認するという作業が必須になってきます。
INDEXを使ってSQLが実行されているかを実行計画で確認できます。また、SQLのコストが高い、低いも実行計画で確認できます。
実行計画を確認することも大切ですが、INDEXを使っていてコストも低いのに遅いSQLも存在します。そういった場合、統計情報からパフォーマンスが劣化している原因を見つける事ができます。
統計情報の各項目の意味を紹介したいと思います。
実行計画と統計情報
SELECT
COUNT(1)
FROM
TB_MAIN X
LEFT JOIN TB_SUB Y ON X.ID = Y.ID
WHERE
Y.ID IS NULL
;
実行計画
----------------------------------------------------------
Plan hash value: 3416551698
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 10 | | 2011 (1)| 00:00:25 |
| 1 | SORT AGGREGATE | | 1 | 10 | | | |
|* 2 | HASH JOIN RIGHT ANTI | | 500K| 4882K| 8304K| 2011 (1)| 00:00:25 |
| 3 | TABLE ACCESS FULL | TB_SUB | 500K| 2441K| | 226 (1)| 00:00:03 |
| 4 | INDEX FAST FULL SCAN| SYS_C007642 | 1000K| 4882K| | 571 (1)| 00:00:07 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("X"."ID"="Y"."ID")
統計
----------------------------------------------------------
0 recursive calls
0 db block gets
2905 consistent gets
0 physical reads
0 redo size
549 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
統計情報の項目説明
| No | 統計項目 | 説明 |
|---|---|---|
| 1 | recursive calls | SQL実行時に内部で発行されたリカーシブコール数 (再帰的コールの回数) |
| 2 | db block gets | DMLやSELECT FOR UPDATEを発行したときなどに発生する カレントモードで読み込まれたブロック数 |
| 3 | consistent gets | SELECTを発行したときなどに発生する 読み取り一貫性モードで読み込まれたブロック数 ※「一貫性読み込み回数」とは取り消し(ROLLBACK)される 可能性のあるデータは扱わずに、確定(COMMIT)された データのみを扱う |
| 4 | physical reads | ディスクアクセスによって読み込まれたブロック数 |
| 5 | redo size | REDOログに書き込まれたサイズ(byte) |
| 6 | bytes sent via SQL*Net to client |
クライアントへ送られた合計byte数 |
| 7 | bytes received via SQL*Net from client |
クライアントから受信した合計byte数 |
| 8 | SQL*Net roundtrips to/from client |
クライアントに送受信されたNetメッセージの合計数 |
| 9 | sorts (memory) | メモリソート回数 |
| 10 | sorts (disk) | ディスクソート回数 |
| 11 | rows processed | SQLが処理した件数 |
以上です