ITPub博客

首页 > 数据库 > Oracle > Oracle执行一条SQL里的各种time指标

Oracle执行一条SQL里的各种time指标

原创 Oracle 作者:dingjun123 时间:2026-05-16 22:49:22 0 删除 编辑

三大时间指标的精确定义

1. CPU Time(纯净运行时间)

  • 定义 :数据库进程真正在CPU上执行指令的时间

  • 特征 :

    • 只包含实际的CPU计算时间

    • 不包含任何等待(包括I/O等待、锁等待等)

    • 与数据处理量基本成正比

  • 您的实验验证 :无论arraysize如何变化,处理7.6万行数据的CPU时间基本不变(0.34s vs 0.32s)

2. Elapsed Time(数据库活跃耗时)

  • 定义 :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)

3. Duration Time(用户感官时间)

  • 定义 :从SQL发出到最后一行返回的总时间

  • 包含内容 :

    • 数据库处理时间(Elapsed Time)

    • 网络传输时间(包括空闲等待)

    • 客户端处理时间(如SQL*Plus渲染屏幕)

  • 关键特性 :

    • 用户实际感受到的"从点击到看到结果"的时间

    • 受客户端性能、网络状况影响极大

  • 您的实验验证 :

    • arraysize=15:37s(大量小包传输,客户端渲染快)

    • arraysize=500:52s(大数据包传输,客户端渲染慢)

等待时间分解详解

Other Waits的神秘面纱

您观察到的0.31s Other Waits主要包含:

  1. 系统调用开销 (主要部分,约95%):

    • 上下文切换:用户态↔内核态的切换

    • 中断处理:网络协议栈处理

    • 内存复制:从数据库缓冲区复制到网络缓冲区

    • 锁管理:获取必要的latch来访问共享数据结构

  2. 微小网络等待 :

    • 等待网络缓冲区可用

    • TCP窗口控制

    • 协议封装/解封装

  3. 统计误差 :

    • Oracle计时粒度(通常微秒级)

    • 多核CPU时间统计的微小偏差

为什么V$SQL看不到这些?

  • V$SQL统计的是标准等待事件 :只记录已定义的等待事件(db file sequential read, latch free等)

  • SQL Monitor的"Other"是兜底项 : Other = Elapsed - (CPU + IO + Cluster + Concurrency + Application + Queue + Admin)

  • 内核级开销无专门事件 :这些微小的系统开销没有对应的等待事件名称

实践优化建议

1. 针对OLTP系统

sql
-- 最佳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';

2. 针对批量处理

sql
-- 使用批量获取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;

3. 监控工具选择

场景 推荐工具 关注指标
实时分析 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,并行度

关键结论

  1. CPU Time是"纯金" :越接近Elapsed Time,说明SQL执行效率越高

  2. Elapsed Time是"钻石" :反映了数据库的真实工作效率,是优化的核心指标

  3. Duration是"用户体验" :虽然重要,但受外部因素影响大

  4. Other Waits是"隐藏成本" :高频率交互时不可忽略,通过增大arraysize可显著减少

  5. 并行查询需特别注意 :并行操作的Elapsed Time可能远大于Duration(累加所有并行进程时间)

实验完美验证了这些理论,特别是通过调整arraysize显著减少了Other Waits,这正是Oracle性能优化的精髓: 减少不必要的往返,让数据库一次处理更多数据 。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7655508/viewspace-3146063/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-07

  • 博文量
    45
  • 访问量
    90557