执行统计信息中db block gets和consistent gets

本文解析了Oracle SQL执行过程中的统计信息,包括物理读、逻辑读、一致性读等概念,并通过具体示例展示了不同操作对这些统计指标的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

physical reads:物理读 来自datafile
logical reads:逻辑读 来自buffer cache(bufer中读取的block数量,用于insert,update,delete,selectfor update

db block gets
:强制读当前版本的数据,只能看来源于data file(是一致读次数(一个block可能会被读多次),bufer中读取的用于查询(除掉select forupdate)的block数量
consistent gets:一致性读,根据session的scn读,可以来自于undo或者data file

recursive calls :递归调用。一般原因:dictionary cache未命中;动态存储扩展;PL/SQL语句

第一次执行:

SQL> insert into tn(a) values(3);

统计信息

----------------------------------------------------------

        166  recursive calls

          4  db block gets

         20  consistent gets

         2  physical reads

       484  redo size

       670  bytes sent via SQL*Net to client

       560  bytes received via SQL*Net from client

         3  SQL*Net roundtrips to/from client

         7  sorts (memory)

         0  sorts (disk)

1     rows processed

 

SQL> insert into tn(a) values(4);

统计信息

----------------------------------------------------------

          1  recursive calls

          4  db block gets

          1  consistent gets

         0  physical reads

       532  redo size

       670  bytes sent via SQL*Net to client

       560  bytes received via SQL*Net from client

         3  SQL*Net roundtrips to/from client

         1  sorts (memory)

         0  sorts (disk)

1     rows processed

SQL> select * from tn;

统计信息

----------------------------------------------------------

          4  recursive calls

          0  db block gets

         16  consistent gets

         0  physical reads

         0  redo size

       700  bytes sent via SQL*Net to client

       400  bytes received via SQL*Net from client

         2  SQL*Net roundtrips to/from client

         0  sorts (memory)

         0  sorts (disk)

        10  rows processed

<think>嗯,用户问的是Oracle执行计划的时间怎么看。首先,我需要回忆一下Oracle的执行计划相关的知识。执行计划通常用来分析SQL语句的性能,但用户可能不知道执行计划本身默认不显示实际执行时间,而是显示的是优化器估算的成本(Cost)。那用户可能实际是想了解如何获取SQL执行的实际耗时,或者如何通过执行计划中的信息来估计时间。 接下来,我需要考虑不同的方法。首先,使用EXPLAIN PLAN FOR命令,但这个生成的是预估的执行计划,不会包含实际执行时间。然后想到的是使用SQL*Plus中的SET TIMING ON,或者在SQL Developer等工具中查看执行时间。此外,还有AUTOTRACEDBMS_XPLAN包,以及实际执行计划与预估的区别。 用户可能遇到的情况是,他们运行了一个SQL,生成了执行计划,但不知道如何从中获取时间信息。需要分步骤说明如何获取实际执行时间,而不仅仅是优化器的估算。可能还需要提到实际执行计划预估执行计划的区别,比如用GATHER_PLAN_STATISTICS提示或者开启STATISTICS_LEVEL=ALL。 还要考虑用户的使用场景,可能是开发或DBA,需要调优SQL语句,所以需要实际执行时间来分析性能。用户可能对执行计划中的各个部分不太熟悉,需要解释如何结合执行计划中的行数、成本等来评估性能。 另外,要注意不同工具的使用方法,比如在SQL Developer中如何查看执行时间,或者在命令行中使用TIMING。可能需要提到一些具体的例子,比如使用DBMS_XPLAN.DISPLAY_CURSOR来获取实际执行计划的统计信息,包括时间。 可能还需要提醒用户,预估时间实际时间可能存在差异,所以实际测量是更可靠的方法。此外,自动追踪功能(AUTOTRACE)可以同时显示执行计划执行时间,这也是一个常用的方法。 总结下来,回答应该分步骤说明如何获取实际执行时间,使用不同的方法工具,以及如何解读执行计划中的相关信息,帮助用户全面了解如何查看Oracle中的执行时间。</think>Oracle执行计划中查看时间涉及预估时间实际执行时间的区分,以下是逐步说明: --- ### 一、**预估执行时间(逻辑成本)** Oracle默认执行计划显示的是优化器估算的**逻辑成本(Cost)**,而非实际时间。查看方法: ```sql EXPLAIN PLAN FOR SELECT * FROM your_table WHERE your_condition; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); ``` 输出示例: ``` ---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 100 | 2000 | 45 (0)| 00:00:01 | ``` - `Cost`:优化器估算的CPU/IO资源消耗(单位无量纲) - `Time`:基于统计信息估算的**理论执行时间**(可能不准确) --- ### 二、**实际执行时间获取** #### 方法1:SQL*Plus/SQL Developer计时 ```sql SET TIMING ON; -- 在SQL*Plus或SQL Developer中启用计时 SELECT * FROM your_table WHERE your_condition; ``` 执行后直接显示实际耗时(如:`Elapsed: 00:00:02.34`)。 #### 方法2:AUTOTRACE(需DBA权限) ```sql SET AUTOTRACE TRACEONLY STATISTICS; SELECT * FROM your_table WHERE your_condition; ``` 输出包含: ``` Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 123 consistent gets 0 physical reads 0 redo size 1048576 bytes sent via SQL*Net to client ... Elapsed: 00:00:01.22 -- 实际耗时 ``` --- ### 三、**实际执行计划含时间统计** #### 步骤1:启用实际执行统计 ```sql ALTER SESSION SET STATISTICS_LEVEL = ALL; -- 或在查询中添加提示:/*+ GATHER_PLAN_STATISTICS */ SELECT * FROM your_table WHERE your_condition; ``` #### 步骤2:查询实际执行计划 ```sql SELECT * FROM TABLE( DBMS_XPLAN.DISPLAY_CURSOR( FORMAT => 'ALLSTATS LAST' ) ); ``` 输出关键字段: ``` | Id | Operation | Starts | A-Rows | A-Time | Buffers | --------------------------------------------------------------- | 0 | SELECT STATEMENT | 1 | 100 |00:00:00.1| 123 | ``` - `A-Time`:实际执行时间(格式:`HH:MM:SS.FF`) - `Buffers`:实际逻辑读次数 --- ### 四、**关键解读原则** 1. **优化器估算(Cost/Time)**:基于统计信息算法模型,可能与实际偏差较大。 2. **实际时间(A-Time/Elapsed)**:需通过执行后统计获取,更准确。 3. **物理读(physical reads)**:高物理读可能暗示磁盘I/O瓶颈。 --- ### 五、工具推荐 - **SQL Developer**:图形化展示执行计划,含实际耗时。 - **AWR报告**:分析历史SQL性能(需DBA权限)。 - **TKPROF**:跟踪SQL执行详情(生成.trc文件分析)。 实际调优时应优先依赖**实际执行时间**资源消耗(如Buffers/Reads),而非优化器估算值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值