等待事件 db file scattered read

2023-11-01 13:10

本文主要是介绍等待事件 db file scattered read,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 db file scattered read 等待事件,在生产环境之中,这个等待事件可能更为常见。 这个事件表明用户进程正在读数据到 Buffer Cache 中,等待直到物理 I/O调用返回。 DB File Scattered Read 发出离散读,将存储上连续的数据块离散的读入到多个不连续的内存位置。 Scattered Read 通常是多块读,在 Full Table Scan 或 Fast Full Scan 等访问方式下使用。

Scattered Read 代表 Full Scan,当执行 Full Scan 读取数据到 Buffer Cache 时,通常连续的数据在内存中的存储位置并不连续,所以这个等待被命名为 Scattered Read( 离散读)。每次多块读读取的数据块数量受初始化参数            DB_FILE_MULTIBLOCK_READ_COUNT 限制。 图简要说明了 Scattered Read 的数据读取方式

从 V$EVENT_NAME 视图可以看到,该等待有 3 个参数,分别代表文件号、 起始数据块号、 数据块的数量:

 

SQL> select * from v$event_name where name='db file scattered read';

EVENT# NAME PARAMETER1 PARAMETER2 PARAMETER3

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

206 db file scattered read file# block# blocks

数据文件号、起始数据块号加上数据块的数量, 通过这些信息可以知道 Oracle Session 正在等待的对象文件等信息。 该等待可能和全表扫描( Full Table Scan)或者快速全索引扫描( Index Fast Full Scan) 的连续读取相关, 根据经验, 通常大量的 db file scattered read 等待可能意味着应用问题或者索引缺失。

在实际环境的诊断过程中, 可以通过 v$session_wait 视图发现 Session 的等待,再结合其他视图找到存在问题的 SQL 等根本原因,从而从根本上解决问题。

当这个等待事件比较显著时, 用户也可以结合 v$session_longops 动态性能视图来进行诊断,该视图中记录了长时间(运行时间超过 6 秒的)运行的事务,可能很多是全表扫描操作(不管怎样,这部分信息都是值得我们注意的),上一个案例就是通过 v$session_longops 快速发现了问题所在。

从 Oracle 9i 开始, Oracle 新增加了一个视图 V$SQL_PLAN 用于记录当前系统 Library Cache 中 SQL 语句的执行计划, 可以通过这个视图找到存在问题的 SQL 语句, 以下是在一个

生产系统中查询得到的结果:

SQL> @getplan

Enter value for waitevent: free buffer waits

old 15: AND b.event = '&waitevent')

new 15: AND b.event = 'free buffer waits')

HASH_VALUE CHILD_NUMBER OPERATION OBJECT COST KBYTES

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

2838180055 0 INSERT STATEMENT CHOOSE Cost=41733 41733

2838180055 0 TABLE ACCESS FULL I_CM_POWER_TEMP 41733 1356468

进而可以通过 v$sql_text 视图获得这个问题 Session 正在执行的 SQL 语句:

SQL> select sid,event from v$session_wait;

SID EVENT

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

1 pmon timer

4 rdbms ipc message

7 rdbms ipc message

5 rdbms ipc message

8 rdbms ipc message

21 free buffer waits

49 free buffer waits

2 db file parallel write

 

3 db file parallel write

6 smon timer

……

16 rows selected.

 

SQL>@ GetSqlBySid

Enter value for sid: 49

old 5: where b.sid='&sid'

new 5: where b.sid='49'

SQL_TEXT

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

insert into i_cm_power_new(PNAME,YYS,SPHM,SJH,SENTTIME,NOTES,PLACE,RMK)

select PNAME,YYS,SPHM,SJH,SENTTIME,NOTES,PLACE,RMK FROM i_cm_power_temp

通过 V$SQL_PLAN 视图, 可以获得大量有用的信息,比如获得全表扫描的对象:

SQL> select distinct object_name,object_owner from v$sql_plan p

2 where p.operation='TABLE ACCESS' and p.options='FULL'

3 and object_owner = 'MKT';

OBJECT_NAME OBJECT_OWNER

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

HD_TEMP MKT

I_CM_BILL MKT

I_CM_IVR_BUTTON MKT

……

TOOLS_HD MKT

TOOLS_HD_NEW MKT

TOOLS_HD_NEW_BAK MKT

TOOLS_IVRBLIST MKT

TOOLS_USER_CANCEL MKT

29 rows selected

或者获得全索引扫描对象:

SQL> select distinct object_name,object_owner from v$sql_plan p

2 where p.operation='INDEX' and p.options='FULL SCAN' ;

OBJECT_NAME OBJECT_OWNER

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

FK_ITEM_LEVEL_CODE AVATAR

FK_ITEM_SELLCNT_CODE AVATAR

FK_MYZZIM_CRTDATE AVATAR

I_SYSAUTH1 SYS

SYS_C008211 WLLM

进而可以通过 V$SQL_PLAN 和 V$SQLTEXT 联合,获得这些查询的 SQL 语句, 查找全

 

表扫描的 SQL 语句可以参考如下语句:

SELECT sql_text FROM v$sqltext t, v$sql_plan p

WHERE t.hash_value = p.hash_value AND p.operation = 'TABLE ACCESS' AND p.options = 'FULL'

ORDER BY p.hash_value, t.piece;

查找 Fast Full Index 扫描的 SQL 语句可以参考如下语句:

SELECT sql_text FROM v$sqltext t, v$sql_plan p

WHERE t.hash_value = p.hash_value AND p.operation = 'INDEX' AND p.options = 'FULL SCAN'

ORDER BY p.hash_value, t.piece;

这些信息对于发现数据库问题,优化数据库性能具有极强的指导意义。 本例中用到的 SQL

代码 getplan.sql 内容如下: :

SET linesize 120

COL operation format a55

COL cost format 99999

COL kbytes format 999999

COL object format a25

SELECT hash_value, child_number, LPAD (' ', 2 * DEPTH) || operation || ' ' || options

|| DECODE (ID, 0, SUBSTR (optimizer, 1, 6) || ' Cost=' || TO_CHAR (COST) ) operation,

object_name OBJECT, COST, ROUND (BYTES / 1024) kbytes

FROM v$sql_plan WHERE hash_value IN (

SELECT a.sql_hash_value FROM v$session a, v$session_wait b

WHERE a.SID = b.SID AND b.event = '&waitevent')

ORDER BY hash_value, child_number, ID;

在 Oracle 10g 中, Oracle 对等待事件进行了分类, db file scattered read 事件被归入 User I/O

一类:

SQL> select name,PARAMETER1 p1,PARAMETER2 p2,PARAMETER3 p3,

2 WAIT_CLASS_ID,WAIT_CLASS#,WAIT_CLASS

3 from v$event_name where name='db file scattered read';

NAME P1 P2 P3 WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS

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

db file scattered read file# block# blocks 1740759767 8 User I/O

 

 

下面是一条有用的SQL语句,在数据库层面查看db file等待事件的I/O是否有问题。

############################  IO 响应时间     ############################  

select to_char(b.begin_interval_time,'yyyy-mm-dd:hh24'),a.event_name,a.avg_time

from (

select event_name,snap_id,round(lag_time/lag_count/1000,2) avg_time from (

select event_name,snap_id,total_waits-lag(total_waits,1,total_waits) over(partition by event_name,instance_number order by snap_id) lag_count,

time_waited_micro-lag(time_waited_micro,1,time_waited_micro) over(partition by event_name,instance_number order by snap_id) lag_time

 from dba_hist_system_event where event_name in ('db file scattered read') <==========这个地方要检查db file sequential read 和 db file scattered read

and instance_number=1) where lag_count>0) a,dba_hist_snapshot b

where b.instance_number=1 <=============这个地方要检查实例1和实例2

and a.snap_id=b.snap_id

order by 2,1;

 

这篇关于等待事件 db file scattered read的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/323203

相关文章

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

PostgreSQL如何用psql运行SQL文件

《PostgreSQL如何用psql运行SQL文件》文章介绍了两种运行预写好的SQL文件的方式:首先连接数据库后执行,或者直接通过psql命令执行,需要注意的是,文件路径在Linux系统中应使用斜杠/... 目录PostgreSQ编程L用psql运行SQL文件方式一方式二总结PostgreSQL用psql运

提示:Decompiled.class file,bytecode version如何解决

《提示:Decompiled.classfile,bytecodeversion如何解决》在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配... 目录问题原因总结问题1、提示:Decompiled .class file,China编程 bytecode