`

Oracle中查看已执行sql的执行计划

 
阅读更多

有时候我们可能会希望查看一条已经执行过的sql的执行计划,常用的方式有两种:a,set autotrace后再重新执行一遍,不过重新执行可能会浪费时间,而且有些语句也不允许(例如修改操作的语句),或者查询v$sql_plan视图,但v$视图的可读性又不是那么好,这里提供一个新方式,通过dbms_xplan.display_cursor来获取执行过的sql的执行计划。

首先看看该函数的语法:
DBMS_XPLAN.DISPLAY_CURSOR(
   sql_id        IN  VARCHAR2  DEFAULT  NULL,
   child_number  IN  NUMBER    DEFAULT  NULL, 
   format        IN  VARCHAR2  DEFAULT  'TYPICAL');

由上可知,我们至少需要找到执行过sql的sql_id,该参数可以从v$sql视图中找到。

下面,举个例子吧,执行一个简单查询:
SQL> select count(0) from cat_product cp,cat_drug cd where cp.medical_id=cd.id;

  COUNT(0)
----------
    118908

如果我们想获取该语句的实际执行计划,通过下列步骤:

1、查询v$sql视图,找到该语句的sql_id(注意哟,必须要确保你要查询的sql语句还在shared pool):
SQL> select sql_id from v$sql where sql_text=
  2  'select count(0) from cat_product cp,cat_drug cd where cp.medical_id=cd.id';

SQL_ID
-------------
c9cxqvr3q4tjd

2、调用dbms_xplan包,查看该语句执行时的实现执行计划:
SQL> select * from table(dbms_xplan.display_cursor('c9cxqvr3q4tjd'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  c9cxqvr3q4tjd, child number 0
-------------------------------------
select count(0) from cat_product cp,cat_drug cd where cp.medical_id=cd.id

Plan hash value: 2559475106

-----------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name                     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                          |       |       |       |   750 (100)|          |
|   1 |  SORT AGGREGATE        |                          |     1 |    50 |       |            |          |
|*  2 |   HASH JOIN            |                          |   118K|  5804K|  4096K|   750   (1)| 00:00:11 |
|   3 |    INDEX FAST FULL SCAN| PK_CAT_DRUG              |   112K|  2758K|       |   186   (1)| 00:00:03 |
|   4 |    INDEX FAST FULL SCAN| TU_CAT_PRODUCT_MED_CHECK |   118K|  2902K|       |   212   (1)| 00:00:03 |
-----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("CP"."MEDICAL_ID"="CD"."ID")

事实上dbms_xplan.display_cursor也非常灵活,如果执行的统计信息也被收集的话,还可以显示出每一步实际的花费时间等信息,例如:

SQL> select /*+gather_plan_statistics*/ count(0) from cat_product cp,cat_drug cd where cp.medical_id=cd.id;

  COUNT(0)
----------
    118908

SQL> select sql_id from v$sql where sql_text=
  2  'select /*+gather_plan_statistics*/ count(0) from cat_product cp,cat_drug cd where cp.medical_id=cd.id';

SQL_ID
-------------
91w1ug6vc9pxh

SQL> select * from table(dbms_xplan.display_cursor('91w1ug6vc9pxh',null,'all iostats last'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  91w1ug6vc9pxh, child number 0
-------------------------------------
select /*+gather_plan_statistics*/ count(0) from cat_product cp,cat_drug cd where cp.medical_id=cd.id

Plan hash value: 2559475106

-----------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name                     | Starts | E-Rows |E-Bytes|E-Temp | Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------------------------------------------------------
|   1 |  SORT AGGREGATE        |                          |      1 |      1 |    50 |       |            |          |      1 |00:00:00.18 | 595 |
|*  2 |   HASH JOIN            |                          |      1 |    118K|  5804K|  4096K|   750   (1)| 00:00:11 |    118K|00:00:00.33 | 595 |
|   3 |    INDEX FAST FULL SCAN| PK_CAT_DRUG              |      1 |    112K|  2758K|       |   186   (1)| 00:00:03 |    112K|00:00:00.01 | 278 |
|   4 |    INDEX FAST FULL SCAN| TU_CAT_PRODUCT_MED_CHECK |      1 |    118K|  2902K|       |   212   (1)| 00:00:03 |    118K|00:00:00.01 | 317 |
-----------------------------------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   3 - SEL$1 / CD@SEL$1
   4 - SEL$1 / CP@SEL$1

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("CP"."MEDICAL_ID"="CD"."ID")

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=0) COUNT(*)[22]
   2 - (#keys=1)
   3 - "CD"."ID"[CHARACTER,24]
   4 - "CP"."MEDICAL_ID"[CHARACTER,24]


35 rows selected.

 

 

http://blog.itpub.net/7607759/viewspace-445628

 

 

分享到:
评论

相关推荐

    oracle 查看当前会话执行的sql语句

    ### Oracle 查看当前会话执行的SQL语句 在Oracle数据库管理中,有时我们需要了解某个特定会话...通过上述方法,我们可以有效地监控和分析Oracle数据库中的SQL执行情况,这对于提高系统的整体性能具有重要意义。

    Oracle中SQL语句执行效率的查找与解决

    3. **SQL执行计划解析**:SQL语句的执行计划是理解其运行方式的关键。Oracle提供了多种工具来分析SQL执行计划,包括EXPLAIN PLAN和AUTOTRACE。通过这些工具,可以详细查看SQL语句如何访问表和索引,以及执行过程中...

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

    在Oracle中,可以使用`v$sqlarea`视图来获取这些信息。以下是一个示例查询: ```sql SELECT sa.SQL_TEXT, sa.SQL_FULLTEXT, sa.EXECUTIONS "执行次数", ROUND(sa.ELAPSED_TIME / 1000000, 2) "总执行时间",...

    oracle怎么查看执行计划

    不同于TKPROF需要格式化跟踪文件才能查看执行计划,AUTOTRACE可以在执行SQL语句的同时生成执行计划,无需额外步骤。同样,与EXPLAIN PLAN相比,AUTOTRACE不仅展示了执行计划,还执行了SQL语句,从而能够提供更加准确...

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

    批处理文件(如.bat文件)在Windows环境中是一种高效的方式,可以自动化执行一系列命令,包括连接数据库和执行SQL语句。在这个场景中,我们可以利用批处理文件来简化Oracle数据库的操作,如删除用户、创建用户、创建...

    ORACLE执行计划和SQL调优

    【Oracle执行计划和SQL调优】是数据库管理中至关重要的环节,主要涉及到如何高效地运行SQL语句,提高数据库性能。下面将详细讲解执行计划的相关概念以及SQL调优的策略。 1. **Rowid的概念**:Rowid是Oracle数据库中...

    性能调优分析之:Oracle SQL执行计划报告生成器

    Oracle SQL执行计划分析器功能的创建3步曲: 1 首先,编译XYG_ALD_SESS_PKG的Package头。 (XYG_ALD_SESS_PKG.sql) 2 接着要建立好下面的4个视图对象。因为XYG_ALD_SESS_PKG包体会用到。(View Create Script v...

    oracle监听执行sql语句

    ### Oracle监听执行SQL语句详解 #### 一、Oracle监听执行概述 在Oracle数据库管理与维护过程中,有时候我们需要了解应用程序正在执行哪些SQL语句,这不仅有助于性能优化,还可以帮助我们诊断潜在的问题。通过监听...

    ORACLE数据库查看执行计划的方法

    执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。1:在PL/SQL下按F5查看执行计划。第三方工具toad等。很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信息,其实这个可以在PL/SQL工具里面...

    Oracle批量执行传多个参数多个SQL文件

    在Oracle数据库管理中,批量执行SQL脚本是常见的任务...通过以上方法,我们可以高效地在Oracle中批量执行多个带参数的SQL文件,实现自动化处理,提升工作效率。在实际应用中,可以根据具体需求和环境选择最适合的方案。

    Oracle批处理:使用C# 自带Oracle驱动一次执行多条Sql语句

    然后,创建一个OracleCommand对象,并设置其CommandType为Text,因为我们将执行SQL文本。接下来,使用CommandText属性添加SQL语句,可以是一条或多条。为了实现批处理,我们可以使用分号(`;`)作为每条SQL语句的分隔...

    ORACLE数据库查看执行计划

    在Oracle数据库环境中,SQL性能优化是提升应用系统性能的关键环节,因为许多性能问题往往源于SQL语句执行效率低下。为了优化SQL,理解并分析执行计划是必不可少的步骤。执行计划揭示了Oracle如何处理一个SQL查询,...

    oracle批量执行sql

    // ※只会执行sql文 不会自动删除表内数据 // oracleStup.bat // 命令行 用户名/密码 @库名 不需要修改 sqlplus C3/AISIN@C3 @sqlFile.sql > execute.log // sqlFile.sql // @@需要处理的sql文路径 @@D:/20150922...

    Oracle执行计划参数解释

    Oracle执行计划参数解释,Oracle SQL优化的基础是看懂Oracle的执行计划,本文当系统整理了Oracle执行计划里面的各种参数。

    Linux下定时自动执行Oracle_SQL

    2. **创建Shell脚本**:接下来,创建一个Shell脚本来调用Oracle客户端工具(如sqlplus)并执行SQL脚本。Shell脚本(ss.sh)中包含了执行日期的记录、输出文件路径的设定以及调用SQL脚本的具体命令。 3. **设置...

    oracle执行计划详解

    Oracle 将 SQL 语句及解析后得到的执行计划存放在内存中,以便下次执行相同的 SQL 语句时可以直接获取执行计划,提高了 SQL 的执行性能和节省了内存的使用。这块位于系统全局区域 SGA(system global area)的共享池...

    oracle11g执行计划管理-(讲解如何固定sql的执行计划)

    2. **首次执行SQL语句**:当一条SQL语句首次执行时,其执行计划会被记录下来并自动添加到执行计划基准线中。 3. **后续执行**:每当这条SQL语句再次执行时,优化器会检查是否有新的执行计划出现。如果有,则将新的...

Global site tag (gtag.js) - Google Analytics