クエリーの結果を捨てて実行時間のみを得る方法

SQL*Plusで SET AUTOTRACE TRACEONLY を設定することで、クエリの実行結果を表示せずに実行だけができる。
実際に実行結果はクライアントに転送されるので、それを含めて時間をみることができる。

接続してラインサイズを調整。

oracle$ sqlplus username/password

SQL*Plus: Release 11.2.0.1.0 Production on Thu Feb 12 23:10:00 2015

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> SET LINESIZE 200

肝心の SET AUTOTRACE TRACEONLY を実行。実行計画と統計も表示する。
SET TIMING ON をあわせて設定して時間も計測。

SQL> SET AUTOTRACE TRACEONLY EXPLAIN STATISTICS

SQL> SET TIMING ON

実行!

SQL> SELECT
    C.customerId,
    NVL(O.numOfOrder, 0) numOfOrder
FROM
    CUSTOMERS C
        LEFT OUTER JOIN
            (SELECT customerId, count(*) numOfOrder FROM ORDERS GROUP BY customerId) O
            ON C.customerId = O.customerId;


100000 rows selected.

Elapsed: 00:00:00.68

Execution Plan
----------------------------------------------------------
Plan hash value: 142913353

----------------------------------------------------------------------------------------------
| Id  | Operation             | Name        | Rows  | Bytes | TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |             |   100K|  3027K|        |   591   (3)| 00:00:09 |
|*  1 |  HASH JOIN OUTER      |             |   100K|  3027K|        |   591   (3)| 00:00:09 |
|   2 |   INDEX FAST FULL SCAN| CUSTOMERS_PK|   100K|   488K|        |    38   (3)| 00:00:01 |
|   3 |   VIEW                |             |   100K|  2559K|        |   552   (3)| 00:00:08 |
|   4 |    HASH GROUP BY      |             |   100K|   492K|   3552K|   552   (3)| 00:00:08 |
|   5 |     TABLE ACCESS FULL | ORDERS      |   300K|  1464K|        |   167   (2)| 00:00:03 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("C"."CUSTOMERID"="O"."CUSTOMERID"(+))


Statistics
----------------------------------------------------------
      0  recursive calls
      0  db block gets
    569  consistent gets
      0  physical reads
      0  redo size
2209414  bytes sent via SQL*Net to client
  73850  bytes received via SQL*Net from client
   6668  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
 100000  rows processed

「100000 rows selected.」の通り、10万行が得られているが、表示はされない。

SET AUTOTRACE するためのロール

SET AUTOTRACE を設定するためには PLUSTRACE ロールが付与されている必要がある。
PLUSTRACE を作成するには、SYS で @?/sqlplus/admin/plustrce.sql を実行すればよい。
ロールが出来れば GRANT するだけ。