快速獲取 SQL 執行耗時是效能分析第一步。SQL*Plus 內建 SET TIMING ON 可自動顯示每條語句的經過時間,零成本、零侵入,是 DBA 與開發人員必備技能。
[oracle@jw ~]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Tue Aug 28 16:59:43 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
SQL> SET TIMING ON;
SQL> SELECT COUNT(*) FROM tab;
COUNT(*)
----------
2447
Elapsed: 00:00:00.03
-- 關閉計時
SET TIMING OFF;
-- 僅顯示毫秒級精度(部分版本支援)
SET TIMING ON;
SET TIME ON; -- 同時顯示當前時間戳
SET AUTOTRACE TRACEONLY EXPLAIN STATISTICS
SET TIMING ON
SELECT * FROM large_table WHERE col = :val;
同時獲得:執行計畫、統計資訊(邏輯讀、物理讀、排序等)、實際耗時。
-- benchmark.sql
SET TIMING ON
SET ECHO ON
SET FEEDBACK ON
SPOOL benchmark_&_DATE..log
-- 測試查詢 1
SELECT /*+ FULL(t) */ COUNT(*) FROM big_table t;
-- 測試查詢 2
SELECT /*+ INDEX(t idx_col) */ COUNT(*) FROM big_table t WHERE col = 100;
SPOOL OFF
V$SQL_MONITOR 更準確| 方法 | 精度 | 適用場景 | 權限需求 |
|---|---|---|---|
| SET TIMING ON | 百分秒 | 互動式、腳本快速驗證 | 無 |
| DBMS_UTILITY.GET_TIME | 百分秒 | PL/SQL 區塊內部計時 | EXECUTE 權限 |
| DBMS_PROFILER | 微秒 | PL/SQL 逐行效能分析 | PROFILER 權限 |
| V$SQL_MONITOR | 秒 | 長時間 SQL 即時監控 | SELECT ANY DICTIONARY |
| AWR/ASH | 秒 | 歷史趨勢分析 | Diagnostic Pack 授權 |