前言:

​ ​SQL语句的逻辑读怎么产生,由哪些部分所组成,了解这些对于我们进行SQL优化非常的重要,因为只有知道了哪一部分的逻辑读占用大,我们才好进行优化,本文主要解读怎么计算SQL语句的逻辑读。

初始表数据:

create table test as select * from dba_objects;
create index test.ind1_test on test(owner) online tablespace users;
exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>'test',tabname=>'test',ESTIMATE_PERCENT=>30,method_opt=>'for all columns size auto',cascade=>true,force=>true,degree=>4);

分析逻辑读的产生:

由于我们通过sqlplus执行语句,需要把每次发送给客户端的行数arraysize 调大,19c默认为15,否则会在返回查询结果时,同一个块被读取多次。

set arraysize 1000;

10046跟踪语句的执行过程。

alter session set events '10046 trace name context forever,level 12';
select * from test where owner='SYSTEM';
alter session set events '10046 trace name context off';

查看会话10046的trace文件路径。

select tracefile from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat));
TRACEFILE
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_6304.trc

格式化trc文件。

tkprof orcl_ora_6304.trc orcl_ora_6304.trc.log sys=no sort=prsela,exeela,fchela 

分析格式后的trc文件内容,可以看到总共的逻辑读访问为32,其中索引访问的逻辑读为5。

通过autotrace查看语句执行的逻辑读也为32。

通过覆盖扫描单独访问索引的逻辑读也为5,即与10046里面索引的执行逻辑读一致。

现在我们已经知道索引扫描用了5个逻辑读,那么剩下的27个逻辑读由谁产生呢?

接下来,通过dbms_rowid计算OWNER=SYSTEM所分布的块数量,数据共分布在26个块上,那么我们可以得出根据rowid回表所读取的逻辑读为26。

select count(distinct dbms_rowid.rowid_block_number(rowid)) from test where owner='SYSTEM';COUNT(DISTINCTDBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))---------------------------------------------------                                                 26

​而最后剩下的1次逻辑读为结果返回给客户端读取1次(1000/599),如果我们把sqlplus 客户端的arraysize 调小为100,则返回结果要至少读取(599/100) 6次,如果数据不是连续刚好分布在6个块上,则逻辑读会更多。

---把arraysize调到100之后,逻辑读次数会增多
Execution Plan
----------------------------------------------------------
Plan hash value: 3502034784
​
-------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |           |  2936 |   378K|    85   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TEST      |  2936 |   378K|    85   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IND1_TEST |  2936 |       |     7   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
​
Predicate Information (identified by operation id):
---------------------------------------------------
​2 - access("OWNER"='SYSTEM')
​
Note
------ automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold
​
​
Statistics
----------------------------------------------------------0  recursive calls0  db block gets41  consistent gets0  physical reads0  redo size78621  bytes sent via SQL*Net to client456  bytes received via SQL*Net from client7  SQL*Net roundtrips to/from client0  sorts (memory)0  sorts (disk)599  rows processed
​
SQL> 

分析总结:    ​    ​

通过10046,autotrace以及结合数据块的分布,我们计算出了SQL语句的逻辑读32次=索引读取5次+数据块读取26+结果返回1次​,这样我们知道了哪一步逻辑读消耗多,在优化SQL时才能更好的对症下药。

Oracle-SQL语句的逻辑读怎么计算相关推荐

  1. oracle中子查询的执行顺序是,Oracle sql语句执行顺序

    sql语法的分析是从右到左 一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...

  2. Oracle sql语句执行顺序

    一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图的 ...

  3. Oracle SQL语句执行过程

    前言 QQ群讨论的时候有人遇到这样的问题:where子句中无法访问Oracle自定义的字段别名.这篇 博客就是就这一问题做一个探讨,并发散下思维,谈谈SQL语句的执行顺序问题. 问题呈现 直接给出SQ ...

  4. Oracle SQL语句执行步骤

    Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...

  5. SqlServer中Sql语句的逻辑执行顺序

    准备数据 Sql脚本如下,两张表,一张客户表Customers只包含customerid和city字段,一张订单表Orders包含orderid和customerid(关联Customers的cust ...

  6. oracle sql语句常用优化方法

    oracle sql语句常用优化方法 最近做一些报表查询,经常做一些小优化,在这里总结一下 语句上的优化: 1.SELECT 语句中避免使用*,用那些字段就摘出哪些. 2.SQL语句尽量用大写: 因为 ...

  7. Oracle SQL语句执行流程与顺序原理详解

    以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...

  8. oracle sql语句中包含‘’ 的解决方法

    oracle sql语句中包含'&' 的解决方法 参考文章: (1)oracle sql语句中包含'&' 的解决方法 (2)https://www.cnblogs.com/hm1990 ...

  9. Oracle查询所有序列;[oracle中如何创建表的自增ID(通过序列);oracle sql语句大全

    Oracle查询所有序列 oracle sql语句大全 oracle中如何创建表的自增ID(通过序列)

最新文章

  1. java写类似百度统计_资讯 | 与百度统计功能类似的产品—360分析系统
  2. 微信从原版到现在所有界面图片_微信突然宣布:现在能改微信号了,所有人都能改...
  3. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 D.寻找-树上LCA(树上a到b的路径上离c最近的点)...
  4. H3C 基于IP的限速
  5. linux设置光标位置,linux下光标定位和输出颜色设置
  6. 字符串中全角半角之间的转换
  7. andorid 回调的理解
  8. Money----思维+模拟
  9. 台达plc控制伺服电机编程实例_plc控制伺服电机程序实例讲解!成功都是可以复制的!...
  10. OpenCV之图像伪彩色增强
  11. 【小程序】快来开发你的第一个微信小游戏(详细流程)
  12. ESP8266+1.3“ or 0.96“ OLED两个太空人动画(胖子和瘦子)
  13. 在Mac上怎么使用Charles进行抓包
  14. 新兴研究将如何更好地应对社会挑战?我们等你来共同探讨!
  15. 金山系不惧微软,前有WPS力扛Office,后有eversheet接力再战
  16. tiptop 编译运行_CPU 利用率背后的真相,只有 1% 人知道
  17. 【前端学习】Day-16 JS基础、循环、函数、数组、字符串、字典
  18. 不同平台使用不同技术实现微信好友、朋友圈分享汇总(H5、taro、uni-app)
  19. 阅文集团Java研发实习生面试经验(base上海)
  20. 内网穿透-花生壳的简单使用

热门文章

  1. Flutter代码可插拨/解耦方案
  2. 编程入门先学python好不好,学python用什么软件编程
  3. 语音转写基于科大讯飞WebApi接口的安卓实现--上传录音音频翻译成文字
  4. win10服务器修改远程密码,win10系统远程桌面保存密码后无法修改的解决方案...
  5. 《沟通的技术——让交流、会议与演讲更有效》一1.1 一切尽在计划之中
  6. 帧内预测——initAdiPattern
  7. J2EE工作流管理系统jBPM详解(二)
  8. Minecraft 1.12.2模组开发(十八) 自定义附魔
  9. 电脑端压缩工具哪个好用
  10. 安科瑞水电气三表集抄电能管理系统在阿克希龙公司的设计方案