开发者博客:www.developsearch.com
一、什么是执行计划(explain plan)
执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。
二、如何查看执行计划
1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。
很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信息,其实这个可以在PL/SQL工具里面设置的。可以看到很多其它信息,如下所示
2: 在SQL*PLUS(PL/SQL的命令窗口和SQL窗口均可)下执行下面步骤
SQL>EXPLAIN PLAN FOR SELECT * FROM SCOTT.EMP; --要解析的SQL脚本 SQL>SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
3: 在SQL*PLUS下(有些命令在PL/SQL下无效)执行如下命令:
SQL>SET TIMING ON --控制显示执行时间统计数据 SQL>SET AUTOTRACE ON EXPLAIN --这样设置包含执行计划、脚本数据输出,没有统计信息 SQL>执行需要查看执行计划的SQL语句 SQL>SET AUTOTRACE OFF --不生成AUTOTRACE报告,这是缺省模式 SQL> SET AUTOTRACE ON --这样设置包含执行计划、统计信息、以及脚本数据输出 SQL>执行需要查看执行计划的SQL语句 SQL>SET AUTOTRACE OFF SQL> SET AUTOTRACE TRACEONLY --这样设置会有执行计划、统计信息,不会有脚本数据输出 SQL>执行需要查看执行计划的SQL语句 SQL>SET AUTOTRACE TRACEONLY STAT --这样设置只包含有统计信息 SQL>执行需要查看执行计划的SQL语句
通过下面脚本查询到trace日志信息
SELECT T.VALUE || '/' || LOWER(RTRIM(I.INSTANCE, CHR(0))) || '_ora_' || P.SPID || '.trc' TRACE_FILE_NAME FROM ( SELECT P.SPID FROM V$MYSTAT M, V$SESSION S, V$PROCESS P WHERE M.STATISTIC# =1 AND S.SID = M.SID AND P.ADDR = S.PADDR ) P, ( SELECT T.INSTANCE FROM V$THREAD T, V$PARAMETER V WHERE V.NAME ='thread' AND (V.VALUE = 0 OR T.THREAD# = TO_NUMBER(V.VALUE)) ) I, (SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest') T
三、看懂执行计划
1.执行顺序
执行顺序的原则是:由上至下,从右向左
由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行
从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。
当然,你在PL/SQL工具中也可以通过它提供的功能来查看执行顺序。如下图所示:
2.执行计划中字段解释
SQL>
recursive calls 递归调用
db block gets 从buffer cache中读取的block的数量当前请求的块数目,当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的正常情况下,一个查询提取的块是在查询查询开始的那个时间点上存在的数据库,当前块是在这个时候存在数据块,而不是这个时间点之前或者之后的的数据块数目。
consistent gets 从buffer cache中读取的undo数据的block的数量数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块,,这里的概念是在你处理你这个操作的时侯需要在一致性读状态上处理多个块,这些块产生的主要原因是因为你在查询过程中,由于其它会话对数据 块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所要需要对回滚 段中的数据块的前映像进行查询,以保证数据的一致性。这样就产生了一致性读。
physical reads 物理读 就是从磁盘上读取数据块的数量。其产生的主要原因是:
1:在数据库高速缓存中不存在这些块。
2:全表扫描
3:磁盘排序
redo size DML生成的redo的大小
sorts (memory) 在内存执行的排序量
sorts (disk) 在磁盘执行的排序量
2091 bytes sent via SQL*Net to client 从SQL*Net向客户端发送了2091字节的数据
416 bytes received via SQL*Net from client 客户端向SQL*Net发送了416字节的数据。
3.具体内容查看
1> Plan hash Value
这一行是这一条语句的的hash值,我们知道ORACLE对每一条ORACLE语句产生的执行计划放在SHARE POOL里面,第一次要经过硬解析,产生hash值。下次再执行时比较hash值,如果相同就不会执行硬解析。
2> COST
COST没有单位,是一个相对值,是SQL以CBO方式解析执行计划时,供ORACLE来评估CBO成本,选择执行计划用的。没有明确的含义,但是在对比是就非常有用。
公式:COST=(Single Block I/O COST + MultiBlock I/O Cost + CPU Cost)/ Sreadtim
3> 对上面执行计划列字段的解释:
Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)
Operation:当前操作的内容。
Name:操作对象
Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。
Bytes:表示执行该步骤后返回的字节数。
Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。
Time:Oracle 估计当前操作的时间。
4.谓词说明:
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("B"."MGR" IS NOT NULL)
4 - access("A"."EMPNO" = "B"."MGR")
Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)。
Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。
在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。
5、 动态分析
如果在执行计划中有如下提示:
Note
------------
-dynamic sampling used for the statement
这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。我们从而推断这个表可能没有做过分析。
这里会出现两种情况:
(1) 如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。
(2) 如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。
相关推荐
一旦连接建立,就可以执行SQL查询,处理结果集,甚至进行事务控制。cx_Oracle库提供了丰富的数据类型映射,使得Python对象可以直接与Oracle数据库的列类型对应,如将Python的字符串映射到Oracle的VARCHAR2,将整数...
3. 使用 `rpm` 命令安装 RPM 包,可能需要以 root 权限执行。 4. 配置数据库参数,如监听端口、服务名等。 5. 启动数据库服务并进行必要的安全设置。 在使用 Oracle XE 时,开发者和管理员应注意: - **权限管理:*...
- `cx_Oracle` 是 Python 开发者用来访问 Oracle 数据库的接口,它允许 Python 程序直接与 Oracle 数据库进行通信,执行 SQL 查询,处理事务等。 - 这个模块支持 Python 2.x 和 3.x 版本,并且兼容 Oracle 的多种...
对于“监控”这个标签,安装完Oracle Instant Client后,可以使用它来连接到数据库并执行性能监视查询,如`v$session_wait`、`v$process`和`v$sysstat`视图,以了解数据库的运行状况。还可以集成其他监控工具,如...
4. **权限和安全配置**:执行必要的权限设置,确保敏感数据的安全,并遵循Oracle的最佳实践。 5. **环境变量**:设置与Oracle数据库安装和运行相关的环境变量,如ORACLE_HOME、PATH、LD_LIBRARY_PATH等。 6. **...
2. **sqlplus**: SQL*Plus 是一个命令行工具,用于执行SQL和PL/SQL语句,以及管理Oracle数据库。通过SQL*Plus,用户可以查询、更新数据,执行脚本,管理用户权限等。 3. **tnslsnr**: TNS监听器(TNS Listener)是...
5. **测试连接**:安装完成后,可以通过Perl脚本测试DBD::Oracle是否工作正常,例如创建一个简单的Perl脚本连接到Oracle数据库并执行SQL查询。 在使用DBD::Oracle时,开发者需要注意以下几点: 1. **连接参数**:...
Oracle-RAC-执行闪回数据库操作.doc
oracle-function-执行动态sql(包括DML、DLL、DQL、DCL)
SQL*Plus是Oracle Instant Client的一部分,是一个命令行工具,用于执行SQL和PL/SQL语句,进行数据库管理、查询、更新和调试。它是数据库管理员和开发人员常用的一种工具,因其简洁高效而备受青睐。在Linux环境下,...
一旦安装完成并配置好,Oracle Instant Client可用于开发和测试数据库连接,如创建数据库连接池、执行SQL查询、调用存储过程等。它也常用于数据库备份、性能监控和故障排查工具,因为它不需要完整的数据库服务器...
Oracle Instant Client是Oracle公司提供的一款轻量级的数据库连接组件,用于在客户端计算机上实现对Oracle数据库的连接和数据操作。这个"oracle-instantclient.11.2.zip"压缩包包含了版本11.2的Instant Client,适用...
通过正确安装和使用cx_Oracle,你可以轻松地在Python环境中执行各种数据库操作,无论是简单的查询还是复杂的事务处理。只要遵循正确的步骤,你就能充分利用cx_Oracle的强大功能,实现高效的数据管理和分析。
Oracle Instant Client是Oracle公司提供的一款轻量级数据库连接工具,主要用在不需要完整Oracle数据库服务器安装的情况下,允许用户从客户端应用程序连接到Oracle数据库。在本例中,我们关注的是"sqlplus 11.2 ...
Oracle的执行计划--下,Oracle的执行计划--下,Oracle的执行计划--下
cx_Oracle是一个Python接口,它使得Python开发者能够方便地与Oracle数据库进行交互,执行SQL查询、事务管理等操作。此版本号为5.1.2,适用于64位Windows操作系统,并且是针对Python 2.7版本编译的。 Oracle数据库是...
DBI提供了一系列的函数和方法,用于建立数据库连接、执行SQL语句、处理结果集等。这样,即使更换了数据库系统,只要相应的DBD支持,代码的改动也会很小。 DBD-Oracle作为DBI的子模块,负责与Oracle数据库进行通信。...