`

查看oracle数据库sql的实际执行计划

阅读更多

        在生产环境中,如果发现某SQL执行慢,要查看它的执行计划,有如下方法:

方法一:

        先查v$sqltext获得HASH_VALUE值,再通过HASH_VALUE值查询v$sql_plan获得此SQL的实际执行计划。

        实例:

        想知道如下SQL的实际执行计划

SELECT /*+ index(tt IX_TT_CREATED_DATE) */ to_char(tt.created_date,'YYYY-MM-DD'),count(1)
 FROM test_table tt
WHERE  tt.code IN('X01', 'X02', 'X333', 'X365')
 AND tt.created_time >= TO_DATE('2014-12-20', 'yyyy-mm-dd')
 AND tt.created_time < TO_DATE('2015-08-20', 'yyyy-mm-dd')
 group by to_char(tt.created_time,'YYYY-MM-DD');

        先查询v$sqltext获得HASH_VALUE值,如果未查询到记录,则可以先执行一下上面的SQL后再查

select * from v$sqltext t where t.SQL_TEXT like 'SELECT /*+ index(pbi IX_PBI_CREATED_DATE) */%'


        上面SQL执行的结果中的HASH_VALUE的值为3042406205,那么我们可以以它作为条件再查询v$sql_plan获得实际的执行计划。

select * from v$sql_plan t where t.HASH_VALUE = '3042406205';

        运行结果如下所示:

 

方法二:

        sqlpuls登录成功后(关于sqlplus的登陆配置,请参考Oracle的tnsnames.ora配置),先设置set linesize 200,然后输入explain plan for select * from table_name...,再执行SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);查询执行计划。


        还可以通过如下语句查看统计信息、SQL资源消耗。

select * from dba_tables a where a.table_name = upper('table_name');

select * from v$sql a where a.SQL_TEXT like 'select * from ...';
        如下所示:


 

PS:v$sql说明

        v$sql:一条语句可以映射多个 cursor,因为对象所指的 cursor可以有不同用户 (如例 1)。如果有多个 cursor(子游标 )存在,在 V$SQLAREA为所有 cursor提供集合信息。

实例:

        这里介绍以下 child cursor

        user A: select * from tbl

        user B: select * from tbl

        大家认为这两条语句是不是一样的啊,可能会有很多人会说是一样的,但我告诉你不一定,那为什么呢?

        这个 tbl A看起来是一样的,但是不一定哦,一个是 A用户的,一个是 B用户的,这时他们的执行计划分析代码差别可能就大了哦,改下写法大家就明白了:

        select * from A.tbl

        select * from B.tbl

  在个别 cursor上, v$sql可被使用。该视图包含 cursor级别资料。当试图定位 session或用户以分析 cursor时被使用。

   PLAN_HASH_VALUE列存储的是数值表示的 cursor执行计划。可被用来对比执行计划。PLAN_HASH_VALUE让你不必一行一行对比即可轻松鉴别两条执行计划是否相同。

V$SQL中的列说明:

        SQL_TEXT: SQL文本的前 1000个字符

        SHARABLE_MEM:占用的共享内存大小 (单位: byte)

        PERSISTENT_MEM:生命期内的固定内存大小 (单位: byte)

        RUNTIME_MEM:执行期内的固定内存大小

        SORTS:完成的排序数

        LOADED_VERSIONS:显示上下文堆是否载入, 1是 0否

        OPEN_VERSIONS:显示子游标是否被锁, 1是 0否

        USERS_OPENING:执行语句的用户数

        FETCHES: SQL语句的 fetch数。

        EXECUTIONS:自它被载入缓存库后的执行次数

        USERS_EXECUTING:执行语句的用户数

        LOADS:对象被载入过的次数

        FIRST_LOAD_TIME:初次载入时间

        INVALIDATIONS:无效的次数

        PARSE_CALLS:解析调用次数

        DISK_READS:读磁盘次数

        BUFFER_GETS:读缓存区次数

        ROWS_PROCESSED:解析 SQL语句返回的总列数

        COMMAND_TYPE:命令类型代号

        OPTIMIZER_MODE: SQL语句的优化器模型

        OPTIMIZER_COST:优化器给出的本次查询成本

        PARSING_USER_ID:第一个解析的用户 ID

        PARSING_SCHEMA_ID:第一个解析的计划 ID

        KEPT_VERSIONS:指出是否当前子游标被使用 DBMS_SHARED_POOL包标记为常驻内存

        ADDRESS:当前游标父句柄地址

        TYPE_CHK_HEAP:当前堆类型检查说明

        HASH_VALUE:缓存库中父语句的 Hash值

        PLAN_HASH_VALUE:数值表示的执行计划。

        CHILD_NUMBER:子游标数量

        MODULE:在第一次解析这条语句是通过调用 DBMS_APPLICATION_INFO.SET_MODULE设置的模块名称。

        ACTION:在第一次解析这条语句是通过调用 DBMS_APPLICATION_INFO.SET_ACTION设置的动作名称。

        SERIALIZABLE_ABORTS:事务未能序列化次数

        OUTLINE_CATEGORY:如果 outline在解释 cursor期间被应用,那么本列将显示出 outline各类,否则本列为空

        CPU_TIME:解析 /执行 /取得等 CPU使用时间 (单位,毫秒 )

        ELAPSED_TIME:解析 /执行 /取得等消耗时间 (单位,毫秒 )

        OUTLINE_SID: outline session标识

        CHILD_ADDRESS:子游标地址

        SQLTYPE:指出当前语句使用的 SQL语言版本

        REMOTE:指出是否游标是一个远程映象 (Y/N)

        OBJECT_STATUS:对象状态 (VALID or INVALID)

        IS_OBSOLETE:当子游标的数量太多的时候,指出游标是否被废弃 (Y/N)

 

参考资料:http://lizhiyu.iteye.com/blog/966626

  • 大小: 4.9 KB
  • 大小: 11.9 KB
  • 大小: 31 KB
  • 大小: 6.3 KB
  • 大小: 8.5 KB
分享到:
评论

相关推荐

    Oracle数据库执行计划

    Oracle数据库执行计划是数据库管理系统在处理SQL查询时所采用的一种策略,它决定了如何最有效地从数据库中检索数据。执行计划涉及到一系列的操作,包括数据的存取方法、索引的使用、连接操作以及优化器的选择。 ...

    SQL SERVER连接oracle数据库几种方法

    在实际开发中,我们经常需要在 SQL Server 中连接 Oracle 数据库,以便实现数据交换和集成。那么,如何在 SQL Server 中连接 Oracle 数据库呢?下面我们将介绍几种常见的方法。 方法 1:使用 OPENDATASOURCE ...

    oracle利用批处理文件执行SQL语句,bat连接oracle数据库并执行语句

    在这个场景中,我们可以利用批处理文件来简化Oracle数据库的操作,如删除用户、创建用户、创建表和触发器,以及执行其他SQL语句。 首先,我们需要了解如何在批处理文件中连接Oracle数据库。这通常通过Oracle的...

    Oralce数据库SQL和pl_sql实例教程

    总的来说,Oracle数据库SQL和PL/SQL实例教程旨在帮助学习者深入理解这两种语言,提高数据库管理与开发的技能,从而在实际工作中更加高效地处理数据。通过详细的章节和实例,读者可以逐步熟悉并熟练运用SQL和PL/SQL...

    Oracle数据库SQL练习

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其SQL语法是进行数据操作和查询的核心工具。本资料包针对Oracle数据库的SQL使用提供了丰富的练习资源,旨在帮助用户深入理解和熟练掌握SQL语言在Oracle环境...

    Oracle数据库SQL和PL/SQL实例教程

    西安电子科技大学出版社出版的《Oracle数据库SQL和PL/SQL实例教程》将通过丰富的实例帮助读者理解和掌握这些概念。读者将学习如何编写高效的SQL查询,以及如何利用PL/SQL进行更复杂的业务逻辑处理。通过实例练习,...

    Oracle数据库sql转换mysql数据库工具

    "Oracle数据库sql转换mysql数据库工具" 提供了解决这一问题的解决方案,允许用户将Oracle数据库中的SQL语句或数据结构转换为MySQL兼容的格式。 在数据库迁移过程中,这样的工具至关重要,因为它可以简化工作流程,...

    查看登录oracle数据库用户记录.docx

    最后,需要使用以下 SQL 语句来查看登录 Oracle 数据库的用户记录: ```sql SELECT * FROM EVENT_LOG; ``` 这将显示用户的登录时间、用户名和登录 IP 地址等信息。 查看登录 Oracle 数据库用户记录的优点 使用...

    oracle 数据库 scott.sql 范例表

    "scott.sql"是一个典型的Oracle数据库示例脚本,它包含了著名的"SCOTT"用户的表和相关数据,这个用户是为了教学和演示目的而设计的。在本文中,我们将深入探讨Oracle数据库的基础知识,以及如何使用"SCOTT"用户和...

    oracle数据库日志查看方法

    ### Oracle数据库日志查看方法详解 #### 一、概述 Oracle数据库是企业级应用中广泛使用的数据库管理系统之一,为了确保数据库系统的稳定运行和快速定位问题,掌握Oracle数据库日志查看方法至关重要。本文将详细...

    省市区oracle数据库sql文件

    标题中的“省市区oracle数据库sql文件”指的是一个包含中国省级、市级、区级地理信息的Oracle数据库SQL脚本文件。这个文件可能包含了用于构建或更新一个地理位置数据库的SQL语句,便于在Oracle数据库系统中存储和...

    oracle查看执行最慢与查询次数最多的sql语句

    本文将详细介绍如何查看Oracle数据库中执行最慢和查询次数最多的SQL语句,以帮助DBA(数据库管理员)识别潜在的性能瓶颈。 首先,我们来看如何查询执行最慢的SQL语句。在Oracle中,可以使用`v$sqlarea`视图来获取...

    浅谈Oracle数据库SQL优化.pdf

    总的来说,Oracle数据库SQL优化是一项涉及多方面考虑的技术工作,需要深入理解SQL执行机制、索引策略以及统计信息的影响。通过对SQL语句的精炼和执行计划的调整,可以显著提升数据库系统的性能和稳定性。在日常维护...

    oracle与sql数据库备份与恢复工具

    首先,Oracle数据库的备份主要依赖于Oracle的RMAN( Recovery Manager)工具。RMAN是Oracle数据库管理员用于备份、恢复和数据库维护的命令行工具。它可以直接连接到数据库实例,执行完整备份、增量备份和表空间备份...

    Oracle数据库的执行计划稳定性分析

    Oracle数据库的执行计划稳定性分析是数据库管理中一个关键的话题,特别是在处理复杂的SQL查询和多表连接时。执行计划,简单来说,就是数据库为执行SQL语句制定的一种操作策略,包括了如何访问数据、如何排序、如何...

    关于Oracle数据库SQL优化系统的研究.pdf

    【Oracle数据库SQL优化系统研究】 随着信息技术的飞速发展,数据在日常生活和工作中扮演着越来越重要的角色。Oracle数据库作为一款广泛使用的大型关系型数据库管理系统,其SQL优化系统对于提升系统性能至关重要。...

    Oracle 数据库SQL和PLSQL实例教程

    本文档标题为《Oracle 数据库SQL和PLSQL实例教程》,是一份面向新手的进阶教程,涵盖了大量可以直接使用的Oracle数据库操作实例。Oracle数据库是全球领先的企业级数据库管理系统之一,支持SQL(结构化查询语言)和...

    linux下批量执行oracle脚本的shell脚本

    在Linux环境下,对Oracle数据库进行批量操作是一项常见的任务,尤其对于系统管理员和DBA来说,高效地执行SQL脚本可以显著提升工作效率。本篇将详细讲解如何利用shell脚本来批量执行Oracle数据库脚本,以及涉及的相关...

    C#版Oracle数据库通用操作类

    `ConnForOracle` 类主要实现了对 Oracle 数据库的基本操作,包括但不限于连接数据库、执行 SQL 语句以及返回结果集等功能。通过此类可以有效地简化数据库操作代码,并提高开发效率。 #### 二、基本属性与构造函数 ...

    Oracle数据库大作业

    这个大作业包含了PPT演示文稿、Word文档以及可能的源代码,为学习者提供了全面了解Oracle数据库在实际场景中应用的实例。 首先,我们从“教务管理系统”这一标签来探讨。教务管理系统是学校日常运营中不可或缺的一...

Global site tag (gtag.js) - Google Analytics