有时候我们可能会希望查看一条已经执行过的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数据库管理中,有时我们需要了解某个特定会话...通过上述方法,我们可以有效地监控和分析Oracle数据库中的SQL执行情况,这对于提高系统的整体性能具有重要意义。
3. **SQL执行计划解析**:SQL语句的执行计划是理解其运行方式的关键。Oracle提供了多种工具来分析SQL执行计划,包括EXPLAIN PLAN和AUTOTRACE。通过这些工具,可以详细查看SQL语句如何访问表和索引,以及执行过程中...
在Oracle中,可以使用`v$sqlarea`视图来获取这些信息。以下是一个示例查询: ```sql SELECT sa.SQL_TEXT, sa.SQL_FULLTEXT, sa.EXECUTIONS "执行次数", ROUND(sa.ELAPSED_TIME / 1000000, 2) "总执行时间",...
不同于TKPROF需要格式化跟踪文件才能查看执行计划,AUTOTRACE可以在执行SQL语句的同时生成执行计划,无需额外步骤。同样,与EXPLAIN PLAN相比,AUTOTRACE不仅展示了执行计划,还执行了SQL语句,从而能够提供更加准确...
批处理文件(如.bat文件)在Windows环境中是一种高效的方式,可以自动化执行一系列命令,包括连接数据库和执行SQL语句。在这个场景中,我们可以利用批处理文件来简化Oracle数据库的操作,如删除用户、创建用户、创建...
【Oracle执行计划和SQL调优】是数据库管理中至关重要的环节,主要涉及到如何高效地运行SQL语句,提高数据库性能。下面将详细讲解执行计划的相关概念以及SQL调优的策略。 1. **Rowid的概念**:Rowid是Oracle数据库中...
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监听执行概述 在Oracle数据库管理与维护过程中,有时候我们需要了解应用程序正在执行哪些SQL语句,这不仅有助于性能优化,还可以帮助我们诊断潜在的问题。通过监听...
执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。1:在PL/SQL下按F5查看执行计划。第三方工具toad等。很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信息,其实这个可以在PL/SQL工具里面...
在Oracle数据库管理中,批量执行SQL脚本是常见的任务...通过以上方法,我们可以高效地在Oracle中批量执行多个带参数的SQL文件,实现自动化处理,提升工作效率。在实际应用中,可以根据具体需求和环境选择最适合的方案。
然后,创建一个OracleCommand对象,并设置其CommandType为Text,因为我们将执行SQL文本。接下来,使用CommandText属性添加SQL语句,可以是一条或多条。为了实现批处理,我们可以使用分号(`;`)作为每条SQL语句的分隔...
在Oracle数据库环境中,SQL性能优化是提升应用系统性能的关键环节,因为许多性能问题往往源于SQL语句执行效率低下。为了优化SQL,理解并分析执行计划是必不可少的步骤。执行计划揭示了Oracle如何处理一个SQL查询,...
// ※只会执行sql文 不会自动删除表内数据 // oracleStup.bat // 命令行 用户名/密码 @库名 不需要修改 sqlplus C3/AISIN@C3 @sqlFile.sql > execute.log // sqlFile.sql // @@需要处理的sql文路径 @@D:/20150922...
Oracle执行计划参数解释,Oracle SQL优化的基础是看懂Oracle的执行计划,本文当系统整理了Oracle执行计划里面的各种参数。
2. **创建Shell脚本**:接下来,创建一个Shell脚本来调用Oracle客户端工具(如sqlplus)并执行SQL脚本。Shell脚本(ss.sh)中包含了执行日期的记录、输出文件路径的设定以及调用SQL脚本的具体命令。 3. **设置...
Oracle 将 SQL 语句及解析后得到的执行计划存放在内存中,以便下次执行相同的 SQL 语句时可以直接获取执行计划,提高了 SQL 的执行性能和节省了内存的使用。这块位于系统全局区域 SGA(system global area)的共享池...
2. **首次执行SQL语句**:当一条SQL语句首次执行时,其执行计划会被记录下来并自动添加到执行计划基准线中。 3. **后续执行**:每当这条SQL语句再次执行时,优化器会检查是否有新的执行计划出现。如果有,则将新的...