コストフィールドは、特定のプランに最適なコストを決定するために内部で使用される比較コストです。異なるステートメントのコストは、実際には直接比較できません。
これにより、同じ最終目標を持つように設計された同様のクエリの相対的なパフォーマンス(CPU、I/O、または時間)を測定するために使用できる、より信頼性の高いメトリックの余地ができますか?
使用できるさまざまなメトリックがあります。
実際にクエリを実行する場合、オラクルは相対的なパフォーマンスを評価するためのさまざまなメトリックを提供します。 SQL * Plusでは、autotrace
を有効にすると、クエリを実行した後、いくつかの実行統計のクイックリストが表示されます。ほとんどの場合、論理I/O(自動トレース出力の「一貫性のある取得」メトリック)を削減すると、応答時間が改善されます。
SQL> set autotrace on;
SQL> select ename from emp;
ENAME
----------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
ENAME
----------
JAMES
FORD
MILLER
14 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 84 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 84 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
340 recursive calls
0 db block gets
71 consistent gets
8 physical reads
0 redo size
715 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
7 sorts (memory)
0 sorts (disk)
14 rows processed
ただし、さらに詳しく知りたい場合は、Oracleがはるかに多くのメトリックを提供します。クエリを実行するとV$STATNAME
、利用可能な何百もの統計が表示されます。 V$SESSTAT
には、セッションのすべての統計の現在の値が含まれているため、「前」のデータを取得してクエリを実行し、「後」のデータを取得して、関心のあるほぼすべてのパフォーマンス統計の変化を確認できます。トムKyteはNice runstats package をまとめました。これはこれを自動化するため、テストハーネスを自分で作成する必要はありません。