逻辑IO只有逻辑读,没有逻辑写

ORACLE物理读和逻辑读(SET AUTOTRACE ON 部分参数解释)

set autotrace 产生部分信息解读的官方文档基本的定义为如下:
recursive calls:  Number of recursive calls generated at both the user and system level.
[url=]Oracle[/url]
maintains tables used for internal processing. When Oracle needs to make a change to
these tables, it internally generates an internal [url=]SQL[/url] statement, which in turn generates a
recursive call.
DB block gets:    The number of accesses to the current image of a block
当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的块数。正常的情况下,一个查询提取的块是在查询开始的那个时间点上存在的数据块,当前块是在这个时刻存在的数据块,
而不是在这个时间点之前或者之后的数据块数目。
Consistent gets:  The number of accesses to a read-consistent image of a block(单位:块次,即读每块的次数
数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块
Physical reads:   The number of blocks read from disk(单位:块次,即读每块的次数)

逻辑读是指读内存,物理读是指读磁盘,在set autotrace on下,他们关系如下:
LOGICAL  IO = db_block_gets + consistent_gets
PHYSICAL IO = physical_reads                
由此,自然也就得出了cache命中率的公式:
Hit Ratio = (db block gets + consistent gets - physical reads) / (db block gets + consistent gets)
或者Hit Ratio = 1 – (physical reads/(db block gets + consistent gets))
逻辑读的理解(摘自晶晶小妹文章):
       我们都知道,数据块是oracle最基本的读写单位,但用户所需要的数据,并不是整个块,而是块中的行,或列.当用户发出SQL语句时,此语句被解析执行完毕,就开始了数据的抓取阶段,在此阶段,服务器进程会先将行所在的数据块从数据文件中读入buffer cache,这个过程叫做物理读.物理读,每读取一个块,就算一次物理读.当块被送进buffer cache后,并不能立即将块传给用户,因为用户所需要的并不整个块,而是块中的行.从buffer cache的块中读取行的过程,就是逻辑读.
       但Oracle并不会在一次逻辑读中,读块中所有的行,而是根据用户的设定,一次读一部分行。为了完成一次逻辑读,服务器进程先要在hash表中查找块所在的cache buffer 链.找到之后,需要在这个链上加一个cache buffer chains 闩,加闩成功之后,就在这个链中寻找指定的块,并在块上加一个pin锁.并释放cache buffer chains闩.然后就可以访问块中的行了.服务器进程不会将块中所有满足条件的行一次取出,而是根据你的抓取命令,每次取一定数量的行.这些行取出之后,会经由PGA传给客户端用户.行一旦从buffer cache中取出,会话要释放掉在块上所加的PIN.本次逻辑读就算结束.如果还要再抓取块中剩余的行,服务器进程要再次申请获得cache bufffer链闩.再次在块上加PIN.这就算是另外一次逻辑读咯.也就是说,服务器进程每申请一次cache buffer链闩,就是一次逻辑读.而每次逻辑读所读取的行的数量,可以在抓取命令中进行设置.
      逻辑读和Cache buffer chains闩关系密切,TOM曾有文章提到,进程每申请一次Cache buffer chains闩,就是一次逻辑读。但是,逻辑读并不等同于Cache buffer chains闩,每次逻辑读,在9i中至少需要获得两Cache buffer chains闩。逻辑读是指在Hash表中定位块的这个过程。
   如果一次Fetch,访问了N个块,就是N个逻辑读。如果一个块中的行,花费N次Fetch才抓取完,也是N个逻辑读。
几个问题:
1. 每次逻辑读所读取的行的数量默认是几条?
2. 如何在抓取命令中设置?
3. 只对当前的session有效吧?
4. 如果采用普通的fetch游标(不用bulk collect),那么每次逻辑读所读取的行的数量是?
问题1:set arraysize 可以设置系统当前的值,查看的语句是:show arraysize,默认值15,有效值1到5000
  补充:Arraysize by default is 15 in sqlplus,10 in JDBC,2 in pro*c,1 in OCI
(参考tomkyte:http://asktom.oracle.com/pls/ask ... ION_ID:880343948514)
问题2:fetch 游标 bulk collect into 变量limit N;
问题3. 只针对当前会话有效.
问题4. 普通的fetch,一次抓取一行,每读一行在不考虑行迁移行链接的情况下,是一个逻辑读.
在sqlplus下利用命令set autotrace on会产生一些统计信息,其中包括Consistent gets,
从官网文档中看不出到底这个值是如何产生的,
如果对一个表进行全表扫描并取出所有记录(select * from table),可以把算法写为:
Consistent gets=rows/arraysize + N (N为读表时在cache中占用的总的块数,参考asktom,ORACLE8i)
或者Consistent gets=rows/arraysize + N + recursive calls(自己[url=]实验[/url]结果,ORACLE10g)

实验如下:

SQL> drop table test;
Table dropped.
Elapsed: 00:00:00.26
SQL> create table test( a int);
Table created.
Elapsed: 00:00:00.04
SQL> begin
  2  for i in 1..10000 loop
  3  insert into test values (i);
  4  end loop;
  5  end;
  6  /
PL/SQL procedure successfully completed.
Elapsed: 00:00:01.68                   --并未执行commit
SQL> set autotrace traceonly
SQL> select count(0) from test;
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 3467505462
-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     6   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| TEST | 10000 |     6   (0)| 00:00:01 |
-------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         23  consistent gets  --此时说明需要从内存读取23次,即占用23个block(不一定就真的占用23个,但至少涉及23个块)
          0  physical reads
          0  redo size
        515  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
SQL> show arraysize        --查看arraysize,这是我之前设置的值1000
arraysize 1000
SQL> select * from test;
10000 rows selected.
Elapsed: 00:00:00.13
Execution Plan
----------------------------------------------------------
Plan hash value: 217508114
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 10000 |   126K|     6   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| TEST | 10000 |   126K|     6   (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement

Statistics
----------------------------------------------------------
         27  recursive calls
          0  db block gets
         60  consistent gets          --发现其值=23(上面结果)+27(recursive calls)+ 10000(总行数)/1000(arraysize)=60
          0  physical reads
          0  redo size
      56026  bytes sent via SQL*Net to client
        591  bytes received via SQL*Net from client
         11  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      10000  rows processed
SQL> /                       --再执行一次上面的语句,不同的是recursive calls 显示为0,相应的consistent gets也减少
10000 rows selected.
Elapsed: 00:00:00.12
Execution Plan
----------------------------------------------------------
Plan hash value: 217508114
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 10000 |   126K|     6   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| TEST | 10000 |   126K|     6   (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         33  consistent gets
          0  physical reads
          0  redo size
      56026  bytes sent via SQL*Net to client
        591  bytes received via SQL*Net from client
         11  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      10000  rows processed

SQL> set arraysize 20                 --设置arraysize为20时,
SQL> /
10000 rows selected.
Elapsed: 00:00:00.23
Execution Plan
----------------------------------------------------------
Plan hash value: 217508114
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 10000 |   126K|     6   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| TEST | 10000 |   126K|     6   (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        523  consistent gets         --发现其值=23(上面结果)+0(recursive calls)+ 10000(总行数)/20(arraysize)=523
          0  physical reads
          0  redo size
     143246  bytes sent via SQL*Net to client    --发现设arraysize=20时网络传输字节少比设arraysize=1000时多了很多
       5981  bytes received via SQL*Net from client
        501  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)

10000  rows processed

疑问:Arraysize by default is 15 in sqlplus,10 in JDBC,2 in pro*c,1 in OCI 未经过实验,另外,在这相应的环境下如何修改arraysize?

(未看)ORACLE物理读和逻辑读(SET AUTOTRACE ON 部分参数解释)[逻辑IO只有逻辑读,没有逻辑写]相关推荐

  1. Oracle 物理读 逻辑读 一致性读 当前模式读总结浅析

    Oracle 物理读 逻辑读 一致性读 当前模式读总结浅析 在ORACLE数据库中有物理读(Physical Reads).逻辑读(Logical Reads).一致性读(Consistant Get ...

  2. Oracle物理存储结构--文件

    原文地址:[基础]Oracle物理存储结构--文件作者:诗意方式 1 数据文件 3.查询数据文件参数 要将数据文件置为脱机状态,可以通过下列语句实现,如将SCOTT对象的数据文件置为脱机状态: SQL ...

  3. Oracle物理的体系结构

    体系结构图的学习: 老余服装店的故事 结构图: SQL查询语句 SGA 共享池shared pool 数据缓存区Buffer cache PGA 进程 SQL更新语句 SGA: 日志缓存区 日志文件 ...

  4. 面试题: !=!=未看12 略多 sql语句练习 非常 有用

    JAVA面试总结 2015年03月25日 16:53:40 阅读数:4306 刚才看到的,先转载过来,没准以后用到-- 面试总结 2013年8月6日: 问题2:Hibernate的核心接口有哪些?   ...

  5. 青年大学习未看人员名单查询(JAVA)

    青年大学习未看人员名单查询 前言 代码演示 compare1 compare2 compare3 文件目录 后记 Compare4(加了一个查询重复观看人物的功能) 前言 感觉自己给个智障似的,(ll ...

  6. 读的, 且经过美化, 能在所有 JavaScript 环境中运行, 并且应该和对应手写的 JavaScript 一样快或者更快.

    目录 试一试 CoffeeScript 代码和注释 CoffeeScript 是一门编译到 JavaScript 的小巧语言. 在 Java 般笨拙的外表下, JavaScript 其实有着一颗华丽的 ...

  7. 未找到 Oracle 客户端和网络组件问题

    最近一直在研究如何解决"未找到 Oracle 客户端和网络组件.这些组件是由 Oracle 公司提供的,是 Oracle 8i 版 (或更高) 客户软件安装的一部分..."的问题, ...

  8. 开机预读快还是不预读快_【采纳后追加100悬赏!】恢复开机预读后为什么变成了延迟预读?...

    简单描述:开机进入桌面后,总要等到任务管理器显示的"开机时间"第8分钟才开始预读![不是不预读,而是延迟预读!]详细描述:以前开机后立马就开始预读(开机后一两分钟),之后所... ...

  9. oracle 12 ORA-01262,oracle物理dg安装:方法二

    本文记录了物理dg的第二种安装方法,使用rman duplicate from active database,不需要做备份文件. 准备工作: 1.两台虚拟机,主机名:n1, n2,操作系统:cent ...

最新文章

  1. win7无法打开计算机共享文件,win7不能共享文件的解决方法
  2. 数据挖掘——我们能从股市数据得出什么,以及一些算法
  3. 深度学习模型大合集:GitHub 趋势榜第一,已斩获 8000+ 星
  4. Echo Socket例子项目
  5. MODS: Fast and Robust Method for Two-View Matching
  6. java 北理工 教材_北理工《Java技术与应用》在线作业
  7. MSCI发布最新ESG评级 三七互娱位居A股游戏行业最高
  8. 从起始点到目标点的最短步数(BFS)
  9. 无向图中两点之间的距离_自然语言处理中距离计算总结
  10. Samba服务的安装
  11. Linux下解决无法远程连接数据库问题
  12. LayaAir destroy 销毁与 removeChild 移除节点
  13. 【图像融合】基于matlab GUI SIFT+小波变换图像拼接融合系统【含Matlab源码 815期】
  14. 学术论文的word排版
  15. 制作影像(dmg)文件详细步骤
  16. R语言入门——rep函数
  17. 导向滤波(Guided Filter)公式详解
  18. 零经验小白的独游历程——U3d学习经验与教程分享
  19. Android studio 运行警告 We recommend using a newer Android Gradle plugin to use compileSdk = 33
  20. JS window 对象 打开新窗口

热门文章

  1. ios p12 证书 certificate id遇到的坑
  2. SharePoint JS延迟加载类(SP.SOD)介绍
  3. Jenkins 流水线 获取git 分支列表_CI/CD 工具选型:Jenkins 还是 GitLab CI/CD?
  4. Matplotlib绘制好看的饼状图:电影类型数据的简单处理与可视化
  5. 7-6 到底是不是太胖了 (10分)
  6. 做好准备就能预防Jumpscare?《人偶馆绮幻夜》的恐惧心理探究
  7. 关于数码照片的打印和分辨率的有关问题的探讨《转》
  8. 用IDEA打开并调试没有使用maven的普通Java WEB项目
  9. TGame游戏新篇:2.2、插曲
  10. Unity 判断目标是否在左边或右边