暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 来自多次会话的相同查询,但看不到多次会话读取

askTom 2017-08-01
307

问题描述

嗨,

我正在浏览下面的链接,并对自己进行了一些测试。

http://oracleinaction.com/simulate-buff-busy/

只关注下面的内容。

过程RUNSELECT
作为
游标假人从t中选择 *;
c1 t_refcur;
记录虚拟 % rowtype;
开始
我在1 .. 1000000
循环
c1:= retDSQL('从t' 中选择 *);
循环
将c1取入rec;
当c1% 未找到时退出;
结束循环;
关闭c1;
结束循环;

结束运行选择;

我同时从5个不同的会话中运行上述过程。

从另一个会话我运行下面的查询。

选择用户名、sid、序列号、sql_id、事件、p1文件 # 、p2块 #
从v $ 会话
席德在哪里
(select sid 从v $ 会话
其中username = 'TEST');

我看到下面的输出

89km4qj1thh13
从t中选择 *

9cnaxppp75nxq
开始GEN_BUF_BUSY.runSELECT; 结束;

用户名SID串行 # SQL_ID事件文件 # 块 #
-
测试44 21 9cnaxppp75nxq db文件分散读取4 553
测试45 29 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试48 37 9cnaxppp75nxq SQL * 来自客户端1650815232 1的Net消息
测试54 89 89km4qj1thh13光标: 引脚S 1134051363 2.0616e 11
测试57 83 9cnaxppp75nxq SQL * 来自客户端1650815232 1的Net消息

SQL>/

用户名SID串行 # SQL_ID事件文件 # 块 #
-
测试44 21 89km4qj1thh13 db文件分散读取4 553
测试45 29 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试48 37 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试54 89 89km4qj1thh13光标: 引脚S 1134051363 2.0616e 11
测试57 83 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息

SQL>/

用户名SID串行 # SQL_ID事件文件 # 块 #
-
测试44 21 89km4qj1thh13 db文件分散读取4 553
测试45 29 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试48 37 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试54 89 89km4qj1thh13光标: 引脚S 1134051363 2.0616e 11
测试57 83 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息

SQL>/

用户名SID串行 # SQL_ID事件文件 # 块 #
-
测试44 21 9cnaxppp75nxq db文件分散读取4 553
测试45 29 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试48 37 9cnaxppp75nxq SQL * 来自客户端1650815232 1的Net消息
测试54 89 89km4qj1thh13光标: 引脚S 1134051363 2.0616e 11
测试57 83 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息

SQL>/

用户名SID串行 # SQL_ID事件文件 # 块 #
-
测试44 21 9cnaxppp75nxq db文件分散读取4 553
测试45 29 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试48 37 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试54 89 9cnaxppp75nxq光标: 引脚S 1134051363 2.0616e 11
测试57 83 9cnaxppp75nxq SQL * 来自客户端1650815232 1的Net消息

SQL>/

用户名SID串行 # SQL_ID事件文件 # 块 #
-
测试44 21 9cnaxppp75nxq db文件分散读取4 553
测试45 29 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试48 37 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试54 89 9cnaxppp75nxq光标: 引脚S 1134051363 2.0616e 11
测试57 83 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息

SQL>/

用户名SID串行 # SQL_ID事件文件 # 块 #
-
测试44 21 89km4qj1thh13 db文件分散读取4 553
测试45 29 9cnaxppp75nxq SQL * 来自客户端1650815232 1的Net消息
测试48 37 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息
测试54 89 89km4qj1thh13光标: 引脚S 1134051363 2.0616e 11
测试57 83 89km4qj1thh13 SQL * 来自客户端1650815232 1的网络消息

请你帮忙解释一下上面的模式好吗?
为什么我在这里看不到 “其他会话阅读”?

问候,
桑迪普

专家解答

我没有仔细看代码,但是随着我们改善缓存中块的并发管理,Oracle的每个发行版都会变得更好。

查看繁忙缓冲区的一种简单得多的方法是让两个会话竞争索引块,例如

SQL> create table t as select 1 x, 'y' y from dual;

Table created.

SQL> create index ix on t ( x ) ;

Index created.

--
-- 'n' sessions do this
--
SQL> begin
  2  for i in 1 .. 100000 loop
  3    insert into t values (1,'z');
  4  end loop;
  5  end;
  6  /

PL/SQL procedure successfully completed.

--
-- and here's the session waits from one of those sessions
--
SQL> @sessev
Sid (Default=this session):

EVENT                                        TOTAL_WAITS TOTAL_TIMEOUTS       SECS
-------------------------------------------- ----------- -------------- ----------
Disk file operations I/O                               2              0        .01
enq: TX - index contention                            59              0        .01
events in waitclass Other                             54              4        .03
buffer busy waits                                   1801              0        .03

复制


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论