`
zybing
  • 浏览: 455978 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【技术】执行计划中的一些参数理解

阅读更多

 

执行计划出来,有一些参数:

 

Cost=1908 Card=2178710 Bytes=39216780

 

 

Cost: 指cbo中这一步所耗费的资源,这个值是相对值。

Card: 是指计划中这一步所处理的行数

Bytes:指cbo中这一步所处理所有记录的字节数,是估算出来的一组值。

 

 

现在来解释一下每一个statistics:

1、DB Block Gets(当前请求的块数目)当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的块数。正常的情况下,一个查询提取的块是在查询开始的那个时间点上存在的数据块,当前块是在这个时刻存在的数据块,而不是在这个时间点之前或者之后的数据块数目。

2、Consistent Gets(数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块)这里的概念是在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操 作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。这样就产 生了一致性读。

3、Physical Reads(物理读)就是从磁盘上读取数据块的数量,其产生的主要原因是: 1、 在数据库高速缓存中不存在这些块 2、 全表扫描 3、 磁盘排序

它们三者之间的关系大致可概括为:逻辑读指的是Oracle从内存读到的数据块数量。一般来说是'consistent gets' + 'db block gets'。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'phsical reads'。

关于physical reads ,db block gets 和consistent gets这三个参数之间有一个换算公式:
数据缓冲区的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )。

select 1-physical_reads/(db_block_gets+consistent_gets) Buffer Cache
from 
   (select value physical_reads from v$sysstat where name='physical reads'),
   (select value consistent_gets from v$sysstat where name='consistent gets'),
   (select value db_block_gets from v$sysstat where name='db block gets')

查询出来的结果Buffer Cache的命中率应该在90%以上,否则需要增加数据缓冲区的大小。

4、Recursive Calls. Number of recursive calls generated at both the user and system level. 
Oracle Database maintains tables used for internal processing. When it needs to change these tables, Oracle Database generates an internal SQL statement, which in turn generates a recursive call. 
In short, recursive calls are basically SQL performed on behalf of your SQL. So, if you had to parse the query, for example, you might have had to run some other queries to get data dictionary information. These would be recursive calls. Space management, security checks, calling PL/SQL from SQL—all incur recursive SQL calls.

5、Sorts (disk). Number of sort operations that required at least one disk write. Sorts that require I/O to disk are quite resource intensive. Try increasing the size of the initialization parameter SORT_AREA_SIZE.

最后我们看下db block gets和consistent gets的区别

buffer_gets=db block gets + consistent gets = LOGIC IO(逻辑读次数)(as opposed to physical io)

consistent gets : 通过不带for update的select 读的次数
db block gets : 通过update/delete/select for update读的次数.


consistent get :在一致读模式下所读的快数,包括从回滚段读的快数。 
db block gets :在当前读模式下所读的快数,比较少和特殊,例如数据字典数据获取,在DML中,更改或删除数据是要用到当前读模式。

consistent gets:consistent_gets是从回滚段中读到的前映(或叫读取一致性影象), 看见的数据是查询开始的时间点的,所以若存在block在查询开始后发生了变化的情况,则必须产生 before image 然后读数据,这就是一致读的含义
查询就是表示 consistent gets (query mode),因为查询要保证所获取的数据的时间点的一致性,所以叫一致读,即使是从当前 buffer 获得的数据,也叫 consistent gets ,这仅仅表达一种模式一种期望,并不表示真实的是从 当前buffer 获得 还是从回滚段获取数据产生的 bufore image 。

db block gets:current mode , 不管这个块上的数据是否可能存在 before image ,也就是说不管是否存在回滚中数据可以 回滚,只看见当前最新块的数据,即使别人正在更新,也看见别人更新状态的数据,比如dml的时候就不需要看见别人更改前的数据,而是看见正在更改的,当然同时,若操作相同数据则被lock住。也就是说一次查询中看见的数据可能不在同一个时间点上,比如一个大的dml,当dml 开始更新一个非常大的表后,这个表更新的过程中,有一个进程去把该表末尾的一个记录更新了,然后这个大更新抵达该记录的时候会被阻塞的,若该进程事物提交,则大更新会覆盖该事务的更新,也就是说,这个大更新所看见的数据是当前的,不具有时间点的一致性,所以叫 current mode,个人认为db block gets这个词用的不好, 容易让人误解. 如果改成inconsistent gets可能会更准确一些。

 

 

 

· Recursive Calls. Number of recursive calls generated at both the user and system level. 
Oracle Database maintains tables used for internal processing. When it needs to change these tables, Oracle Database generates an internal SQL statement, which in turn generates a recursive call. 
In short, recursive calls are basically SQL performed on behalf of your SQL. So, if you had to parse the query, for example, you might have had to run some other queries to get data dictionary information. These would be recursive calls. Space management, security checks, calling PL/SQL from SQL—all incur recursive SQL calls. 

· DB Block Gets. Number of times a CURRENT block was requested. 


Current mode blocks are retrieved as they exist right now, not in a consistent read fashion.
Normally, blocks retrieved for a query are retrieved as they existed when the query began. Current mode blocks are retrieved as they exist right now, not from a previous point in time. 
During a SELECT, you might see current mode retrievals due to reading the data dictionary to find the extent information for a table to do a full scan (because you need the "right now" information, not the consistent read). During a modification, you will access the blocks in current mode in order to write to them. 
(DB Block Gets:请求的数据块在buffer能满足的个数)

· Consistent Gets. Number of times a consistent read was requested for a block. 
This is how many blocks you processed in "consistent read" mode. This will include counts of blocks read from the rollback segment in order to roll back a block. 
This is the mode you read blocks in with a SELECT, for example. 
Also, when you do a searched UPDATE/DELETE, you read the blocks in consistent read mode and then get the block in current mode to actually do the modification. 
(Consistent Gets:数据请求总数在回滚段Buffer中)

· Physical Reads. Total number of data blocks read from disk. This number equals the value of "physical reads direct" plus all reads into buffer cache. (Physical Reads:实例启动后,从磁盘读到Buffer Cache数据块数量)

· Sorts (disk). Number of sort operations that required at least one disk write. Sorts that require I/O to disk are quite resource intensive. Try increasing the size of the initialization parameter SORT_AREA_SIZE.

(Sorts(disk):从磁盘上进行排序的数量)

Physical Reads通常是我们最关心的,如果这个值很高,说明要从磁盘请求大量的数据到Buffer Cache里,通常意味着系统里存在大量全表扫描的SQL语句,这会影响到数据库的性能,因此尽量避免语句做全表扫描,对于全表扫描的SQL语句,建议增加相关的索引,优化SQL语句来解决。

关于physical reads ,db block gets 和consistent gets这三个参数之间有一个换算公式:

数据缓冲区的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )

在SQL语句里体现如下:

用以下语句可以查看数据缓冲区的命中率:

SQL>SELECT name, value   FROM v$sysstat   WHERE name IN ('db block gets', 'consistent gets','physical reads');

查询出来的结果Buffer Cache的命中率应该在90%以上,否则需要增加数据缓冲区的大小。

 

 


1、DB Block Gets(当前请求的块数目)
当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的块数。正常的情况下,一个查询提取的块是在查询开始的那个时间点上存在的数据块,当前块是在这个时刻存在的数据块,而不是在这个时间点之前或者之后的数据块数目。
2、Consistent Gets(数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块)
这里的概念是在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。这样就产 生了一致性读。
3、Physical Reads(物理读)
就是从磁盘上读取数据块的数量,其产生的主要原因是:
1、 在数据库高速缓存中不存在这些块
2、 全表扫描
3、 磁盘排序
它们三者之间的关系大致可概括为:
逻辑读指的是Oracle从内存读到的数据块数量。一般来说是'consistent gets' + 'db block gets'。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'phsical reads'。

 

分享到:
评论

相关推荐

    关于Oracle中执行计划稳定性深入研究

    在Oracle数据库系统中,执行计划是数据库为了执行SQL查询而制定的一种操作策略,它详细描述了数据如何被访问、如何排序、如何过滤等一系列步骤。执行计划的稳定性涉及到查询性能的可预测性和一致性,这对于数据库...

    剖析SQL Server执行计划

    为了提高效率,SQL Server会在执行计划缓存中存储已经优化过的执行计划。当相同的查询再次执行时,系统可以直接从缓存中获取已有的执行计划,从而节省了重新优化的时间。 **4. 清除缓存中的计划** 尽管执行计划...

    db2执行计划的使用和更新

    为了能够查看和分析这个执行计划,首先需要在数据库中创建执行计划表。这一过程通常涉及到运行特定的DDL脚本,如“EXPLAIN.DDL”,在当前数据库内生成一组专门用于存储解释数据的表格。 **二、执行计划表详解** 1....

    Oracle 执行计划

    优化器根据表的统计信息、存储参数、可用的执行路径等生成执行计划,以实现最快的查询速度。执行计划通常用一系列数据库操作符来表示,这些操作符及其顺序由优化器使用查询转换和物理优化技术来决定。 生成执行计划...

    网络计划技术节点参数和关键路径的MATLAB实现及优化.pdf

    网络计划技术是一种科学的管理方法,其核心是通过网络图来表示项目或作业的计划与控制,其中,各个节点的时间参数和关键路径的确定非常关键。关键路径法(Critical Path Method,简称CPM)和计划评审技术(Program ...

    带参数的可执行文件()

    在计算机科学领域,带参数的可执行文件是一种高级编程概念,它允许用户通过命令行界面(CLI)向程序传递...通过理解和实践如何创建和使用带参数的可执行文件,开发者能够构建更加灵活、强大且适应性更强的软件解决方案。

    计划任务 定时执行

    在这个例子中,我们关注的是如何设置计划任务来定时执行代码,比如定时上传文件或其他操作。下面我们将深入探讨计划任务的原理、实现方式以及在实际应用中的常见技术。 计划任务,也称为定时任务或调度任务,是一种...

    穆尔传感器与执行器的连接系统 - 分线盒技术参数样本.pdf

    穆尔传感器与执行器的连接...这些参数对于理解分线盒的工作方式和性能至关重要,尤其是在工业自动化系统设计和安装过程中。通过这些详细的技术规格,工程师和设计师可以确保分线盒能够在特定的环境和应用中可靠地运作。

    深入理解MySQL核心技术_MYSQL_

    以上是《深入理解MySQL核心技术》中涉及的主要内容,这些知识点对于数据库管理员、开发人员以及任何需要处理MySQL数据库的人来说,都是不可或缺的基础知识。深入学习和理解这些内容,能够提升你在MySQL领域的专业...

    深入理解Oracle解释计划

    在数据库管理与优化领域,深入理解Oracle执行计划对于提升SQL查询效率至关重要。本文旨在详细介绍Oracle执行计划的基础概念、重要性及其查看方法,并通过一系列实用技巧帮助读者更好地解读与优化执行计划。 #### 二...

    初中信息技术川教版(2019)七年级上册-python中circle()各参数的理解.docx

    为了便于学生理解,代码中使用了time.sleep()函数来暂停程序执行,让每个图形有足够的展示时间。此外,还使用了color()函数来改变画笔的颜色,使得图形更鲜明,增加学习的趣味性。 总的来说,circle()函数是Python ...

    C#参数化查询,避免SQL注入

    数据库引擎可以缓存预编译的SQL语句模板,当使用相同的模板但不同的参数值时,可以直接复用已编译的计划,提高了执行效率。 防止SQL注入.htm和参数化查询示例代码.txt文件可能包含了更详细的解释和示例代码,可以...

    表达式解析和执行,支持参数和函数

    本文将深入探讨标题和描述中提到的“表达式解析和执行,支持参数和函数”的概念,以及如何在C#环境中实现。 **表达式解析** 表达式解析是指将人类可读的数学或逻辑表达式转换为计算机可以理解的形式。在C#中,这...

    ORACLE数据库参数设置技术手册

    在实际操作中,理解Oracle数据库的参数设置不仅能够提升系统的响应速度,还能有效防止因配置不当导致的系统瓶颈或故障。 手册的目的在于提供一套标准的参数设置指南,帮助读者掌握Oracle数据库的核心内存结构,以及...

    ASM函数监听实现(三)拦截注入函数的参数值 (函数执行前)

    为了在函数执行前拦截参数值,我们需要在`visitInsn`方法中插入自定义逻辑,这通常是在调用`invokeXXX`系列方法之前。 接下来,我们要创建一个`ClassAdapter`,这是ASM提供的一种简化类改造的工具。通过继承`Class...

    多线程异步调用(并参递参数)

    在单线程环境中,程序执行是顺序的,一次只能做一件事。而在多线程环境中,程序可以同时执行多个任务,每个任务称为一个线程。线程之间共享同一块内存空间,但各自拥有独立的执行流程。这样可以使得CPU在不同任务间...

    S参数反演法.rar_NWR_S参数反演法_s参数_s参数反演_电 反演

    总的来说,S参数反演法和NWR方法是微波和射频工程中分析和设计的关键技术,它们可以帮助工程师们理解和优化他们的电路或天线设计。通过使用MATLAB这样的工具,结合适当的算法和模型,可以有效地从实验数据中获取宝贵...

    SQL参数化查询的另一个理由 命中执行计划

    SQL参数化查询是一种优化数据库性能的技术,其主要目标是命中执行计划,以减少数据库运行时的解析和编译开销,从而提升系统效率。执行计划是数据库管理系统预先编译好的SQL语句执行策略,用于指导如何高效地从数据中...

Global site tag (gtag.js) - Google Analytics