首页 > 数据库 > Oracle > Oracle执行一条SQL里的各种time指标
定义 :数据库进程真正在CPU上执行指令的时间
特征 :
只包含实际的CPU计算时间
不包含任何等待(包括I/O等待、锁等待等)
与数据处理量基本成正比
您的实验验证 :无论arraysize如何变化,处理7.6万行数据的CPU时间基本不变(0.34s vs 0.32s)
定义 :SQL从开始执行到结束Fetch的时间,排除客户端空闲等待
核心公式
:
Elapsed Time = CPU Time + 非空闲等待时间
关键特性 :
只计算"数据库在干活"的时间
如果并行操作,会累加所有并行子进程的时间
不包含 :客户端处理数据的空闲时间、网络传输的空闲时间
但包含 :Fetch过程中的网络系统调用开销(微小的内核级等待)
您的实验验证 :
arraysize=15时:0.65s = 0.34s(CPU) + 0.31s(Other)
arraysize=500时:0.38s = 0.32s(CPU) + 0.05s(Other) + 0.01s(IO)
定义 :从SQL发出到最后一行返回的总时间
包含内容 :
数据库处理时间(Elapsed Time)
网络传输时间(包括空闲等待)
客户端处理时间(如SQL*Plus渲染屏幕)
关键特性 :
用户实际感受到的"从点击到看到结果"的时间
受客户端性能、网络状况影响极大
您的实验验证 :
arraysize=15:37s(大量小包传输,客户端渲染快)
arraysize=500:52s(大数据包传输,客户端渲染慢)
您观察到的0.31s Other Waits主要包含:
系统调用开销 (主要部分,约95%):
上下文切换:用户态↔内核态的切换
中断处理:网络协议栈处理
内存复制:从数据库缓冲区复制到网络缓冲区
锁管理:获取必要的latch来访问共享数据结构
微小网络等待 :
等待网络缓冲区可用
TCP窗口控制
协议封装/解封装
统计误差 :
Oracle计时粒度(通常微秒级)
多核CPU时间统计的微小偏差
V$SQL统计的是标准等待事件 :只记录已定义的等待事件(db file sequential read, latch free等)
SQL Monitor的"Other"是兜底项
:
Other = Elapsed - (CPU + IO + Cluster + Concurrency + Application + Queue + Admin)
内核级开销无专门事件 :这些微小的系统开销没有对应的等待事件名称
-- 最佳arraysize设置set arraysize 100-500 -- 平衡网络往返和内存使用-- 监控建议SELECT sql_id, elapsed_time/1000000 as elapsed_sec, cpu_time/1000000 as cpu_sec, (elapsed_time - cpu_time)/1000000 as wait_sec, executions, rows_processed, round(rows_processed/greatest(executions,1)) as rows_per_execFROM v$sqlWHERE sql_id = 'your_sql_id';
-- 使用批量获取set arraysize 1000-5000-- 或者使用PL/SQL批量处理DECLARE CURSOR c_data IS SELECT * FROM large_table; TYPE t_data IS TABLE OF c_data%ROWTYPE; v_data t_data;BEGIN OPEN c_data; LOOP FETCH c_data BULK COLLECT INTO v_data LIMIT 1000; EXIT WHEN v_data.COUNT = 0; -- 处理数据 END LOOP; CLOSE c_data;END;
| 场景 | 推荐工具 | 关注指标 |
|---|---|---|
| 实时分析 | SQL Monitor | Duration, Elapsed, CPU, Other Waits |
| 历史分析 | AWR/ASH | DB Time, CPU Time, Wait Events |
| 单SQL优化 | 10046 Trace | Parse/Execute/Fetch时间,等待事件 |
| 批量作业 | V$SQL_MONITOR | Elapsed vs CPU,并行度 |
CPU Time是"纯金" :越接近Elapsed Time,说明SQL执行效率越高
Elapsed Time是"钻石" :反映了数据库的真实工作效率,是优化的核心指标
Duration是"用户体验" :虽然重要,但受外部因素影响大
Other Waits是"隐藏成本" :高频率交互时不可忽略,通过增大arraysize可显著减少
并行查询需特别注意 :并行操作的Elapsed Time可能远大于Duration(累加所有并行进程时间)
实验完美验证了这些理论,特别是通过调整arraysize显著减少了Other Waits,这正是Oracle性能优化的精髓: 减少不必要的往返,让数据库一次处理更多数据 。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7655508/viewspace-3146063/ ,如需转载,请注明出处,否则将追究法律责任。