oracleexplain的用法 oraclexeuniv

莫娜号 1

如何看懂ORACLE执行

打开Oracle Database软件后进入软件数据库主界面,在PL/SQL下按F5查看执行,在这里面可以看到基数、优化器、耗费等基本信息 如图

oracleexplain的用法 oraclexeunivoracleexplain的用法 oraclexeuniv


oracleexplain的用法 oraclexeuniv


2在SQLPLUS,PL/SQL的命令窗口下执行下面步骤 :

SQL>EXPLAIN PLAN FOR

SELECT FROM SCOTT.EMP; --要解析的SQL脚本

SQL>SELECT FROM TABLE(DBMS_XPLAN.DISPLAY);

如图

完成以上步骤后还需要在SQLPLUS下输入代码执行命令:

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 --这样设置会有执行、统计信息,不会有脚本数据输出

输入第5段代码:

SQL>执行需要查看执行的SQL语句 SQL>SET AUTOTRACE TRACEONLY STAT --这样设置只包含有统计信息 SQL>执行需要查看执行的SQL语句

需要注意的是:在Oracle Database中,PL/SQL Dloper 工具并不完全支持所有的SQLPlus命令,如果执行“SET AUTOTRACE ON”命令就会报错,出现接下来的情况:

SQL> SET AUTOTRACE ON;

Cannot SET AUTOTRAC

PL/SQL DEVELOPER工具里面执行上面脚本过后,我们是看不到相关信息的,这时我们可以通过输入脚本代码查询执行过的信息,代码如下:

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

如图所示:

我们通过Oracle Database,查看执行后,通常要以文本的形式保存下来,可以输入命令:tkprof D:ORACLEPRODUCT10.2.0DB_1RDBMSTRACE/wgods_ora_3940.trc h:out.txtoutputfile explain=etl/etl 执行 如图

执行上面命令后,就可以查看生成的文本文件了如图

以上就是如何用Oracle Database,查看执行的步骤,需要注意的是PL/SQL Dloper 工具并不完全支持所有的SQLPlus命令,执行SET AUTOTRACE ON 就如此,在PL/SQL Dloper工具下执行此命令会报错。

Oracle中获取执行的几种方法分析

以下是对Oracle中获取执行的几种方法进行了详细的分析介绍 需要的朋友可以参考下 预估执行 Explain Plan Explain plan以SQL语句作为输入 得到这条SQL语句的执行 并将执行输出存储到表中 首先 在你要执行的SQL语句前加explain plan for 此时将生成的执行存储到表中 语句如下 explain plan for SQL语句 然后 在表中查询刚刚生成的执行 语句如下 select from table(dbms_xplan display); 注意 Explain plan只生成执行 并不会真正执行SQL语句 因此产生的执行有可能不准 因为

)当前的环境可能和执行生成时的环境不同 )不会考虑绑定变量的数据类型 )不进行变量窥视

查询内存中缓存的执行 (dbms_xplan display_cursor) 如果你想获取正在执行的或刚执行结束的SQL语句真实的执行(即获取library cache中的执行) 可以到动态性能视图里查询 方法如下

)获取SQL语句的游标 游标分为父游标和子游标 父游标由sql_id(或联合address和hash_value)字段表示 子游标由child_number字段表示

如果SQL语句正在运行 可以从v$session中获得它的游标信息 如 select status sql_id sql_child_number from v$session where status= ACTIVE and

如果知道SQL语句包含某些关键字 可以从v$sql视图中获得它的游标信息 如 select sql_id child_number sql_text from v$sql where sql_text like %关键字%‘

)获取库缓存中的执行 为了获取缓存库中的执行 可以直接查询动态性能视图v$sql_plan和v$sql_plan_statistics_all等 但更方便的方法是以sql_id和子游标为参数 执行如下语句 select from table(dbms_xplan display_cursor( sql_id child_number));

)获取前一次的执行 set serveroutput off select from table(dbms_xplan display_cursor(null null ALLSTATS LAST ));

查询历史执行(dbms_xplan display_awr) AWR会定时把动态性能视图中的执行保存到dba_hist_sql_plan视图中 如果你想要查看历史执行 可以采用如下方法查询 select from table(dbms_xplan display_awr( sql_id );

在用sqlplus做SQL开发是(Autotrace) set autotrace是sqlplus工具的一个功能 只能在通过sqlplus连接的session中使用 它非常适合在开发时测试SQL语句的性能 有以下几种参数可供选择

SET AUTOTRACE OFF 不显示执行和统计信息 这是缺省模式 SET AUTOTRACE ON EXPLAIN 只显示优化器执行 SET AUTOTRACE ON STATISTICS 只显示统计信息 SET AUTOTRACE ON 执行和统计信息同时显示 SET AUTOTRACE TRACEONLY 不真正执行 只显示预期的执行 同explain plan 生成Trace文件查询详细的执行 (SQL_Trace ) SQL_TRACE 作为初始化参数可以在实例级别启用 也可以只在会话级别启用 在实例级别启用SQL_TRACE会导致所有进程的活动被跟踪 包括后台进程及所有用户进 程 这通常会导致比较的性能问题 所以在一般情况下 我们使用sql_trace跟踪当前进程 方法如下

SQL>alter session set sql_trace=true; 被跟踪的SQL语句 SQL>alter session set sql_trace=false; 如果要跟踪其它进程 可以通过Oracle提供的系统包DBMS_SYSTEM SET_SQL_TRACE_IN_SESSION来实现 例 如 SQL> exec dbms_ set_sql_trace_in_session(sid serial# true) 开始跟踪 SQL> exec dbms_ set_sql_trace_in_session(sid serial# false) 结束跟踪

lishixinzhi/Article/program/Oracle/201311/19003

oracle的Explain Plan如何阅读

explain plan for select from table;

select from table(dbms_xplan.display); 你说的是这个吗?

这样生成的执行看了也是白看,因为explain plan for 是不能对sql语句中的绑定变量进行窥测的,生成的执行也是不准确的。生产中大部分sql都是使用绑定变量的。

oracle如何查询执行?

explain plan for SELECT a, b FROM test ORDER BY a;

select from table(dbms_xplan.display);

按缩进顺序执行命令,内层先执行,同一层顺序执行

参考资料

浅谈存取Oracle当中扫描数据的方法

) 全表扫描(Full Table Scans FTS)

为实现全表扫描 Oracle读取表中所有的行 并检查每一行是否满足语句的WHERE限制条件一个多块读作可以使一次I/O能读取多块数据块(db_block_multiblock_read_count参数设定) 而不是只读取一个数据块 这极大的减少了I/O总次数 提高了系统的吞吐量 所以利用多块读的方法可以十分高效地实现全表扫描 而且只有在全表扫描的情况下才能使用多块读作 在这种访问模式下 每个数据块只被读一次

使用FTS的前提条件 在较大的表上不建议使用全表扫描 除非取出数据的比较多 超过总量的 % % 或你想使用并行查询功能时

使用全表扫描的例子

SQL> explain plan for select from dual; Query Plan SELECT STATEMENT[CHOOSE] Cost= TABLE ACCESS FULL DUAL

) 通过ROWID的表存取(Table Access by ROWID或rowid lookup)

行的ROWID指出了该行所在的数据文件 数据块以及行在该块中的位置 所以通过ROWID来存取数据可以快速定位到目标数据上 是Oracle存取单行数据的最快方法

这种存取方法不会用到多块读作 一次I/O只能读取一个数据块 我们会经常在执行中看到该存取方法 如通过索引查询数据

使用ROWID存取的方法

SQL> explain plan for select from dept where rowid = AAAAyGAADAAAAATAAF ; Query Plan SELECT STATEMENT [CHOOSE] Cost= TABLE ACCESS BY ROWID DEPT [ANALYZED]

)索引扫描(Index Scan或index lookup)

我们先通过index查找到数据对应的rowid值(对于非索引可能返回多个rowid值) 然后根据rowid直接从表中得到具体的数据 这种查找方式称为索引扫描或索引查找(index lookup) 一个rowid的表示一行数据 该行对应的数据块是通过一次i/o得到的 在此情况下该次i/o只会读取一个数据库块

在索引中 除了存储每个索引的值外 索引还存储具有此值的行对应的ROWID值 索引扫描可以由 步组成 ( ) 扫描索引得到对应的rowid值 ( ) 通过找到的rowid从表中读出具体的数据 每步都是单独的一次I/O 但是对于索引 由于经常使用 绝大多数都已经CACHE到内存中 所以第 步的I/O经常是逻辑I/O 即数据可以从内存中得到 但是对于第 步来说 如果表比较大 则其数据不可能全在内存中 所以其I/O很有可能是物理I/O 这是一个机械作 相对逻辑I/O来说 是极其费时间的 所以如果多大表进行索引扫描 取出的数据如果大于总量的 % % 使用索引扫描会效率下降很多 如下列所示

SQL> explain plan for select empno ename from emp where empno= ; Query Plan SELECT STATEMENT [CHOOSE] Cost= TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX UNIQUE SCAN EMP_I

但是如果查询的数据能全在索引中找到 就可以避免进行第 步作 避免了不必要的I/O 此时即使通过索引扫描取出的数据比较多 效率还是很高的

SQL> explain plan for select empno from emp where empno= ; 只查询empno列值 Query Plan SELECT STATEMENT [CHOOSE] Cost= INDEX UNIQUE SCAN EMP_I

进一步讲 如果sql语句中对索引列进行排序 因为索引已经预先排序好了 所以在执行中不需要再对索引列进行排序

SQL> explain plan for select empno ename from emp where empno > order by empno; Query Plan SELECT STATEMENT[CHOOSE] Cost= TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX RANGE SCAN EMP_I [ANALYZED]

从这个例子中可以看到 因为索引是已经排序了的 所以将按照索引的顺序查询出符合条件的行 因此避免了进一步排序作

根据索引的类型与where限制条件的不同 有 种类型的索引扫描

索引扫描(index unique scan)

索引范围扫描(index range scan)

索引全扫描(index full scan)

索引快速扫描(index fast full scan)

( ) 索引扫描(index unique scan)

通过索引查找一个数值经常返回单个ROWID 如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话 Oracle经常实现性扫描

使用性约束的例子

SQL> explain plan for select empno ename from emp where empno= ; Query Plan SELECT STATEMENT [CHOOSE] Cost= TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX UNIQUE SCAN EMP_I

( ) 索引范围扫描(index range scan)

使用一个索引存取多行数据 在索引上使用索引范围扫描的典型情况下是在谓词(where限制条件)中使用了范围作符(如> < <> >= <= beeen)

使用索引范围扫描的例子

SQL> explain plan for select empno ename from emp where empno > order by empno; Query Plan SELECT STATEMENT[CHOOSE] Cost= TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX RANGE SCAN EMP_I [ANALYZED]

在非索引上 谓词col = 可能返回多行数据 所以在非索引上都使用索引范围扫描

使用index rang scan的 种情况

(a) 在索引列上使用了range作符(> < <> >= <= beeen)

(b) 在组合索引上 只使用部分列进行查询 导致查询出多行

(c) 对非索引列上进行的任何查询

( ) 索引全扫描(index full scan)

与全表扫描对应 也有相应的全索引扫描 而且此时查询出的数据都必须从索引中可以直接得到

全索引扫描的例子

An Index full scan will not perform single block i/o s and so it may prove to be inefficient e g Index BE_IX is a concatenated index on big_emp (empno ename) SQL> explain plan for select empno ename from big_emp order by empno ename; Query Plan SELECT STATEMENT[CHOOSE] Cost= INDEX FULL SCAN BE_IX [ANALYZED]

( ) 索引快速扫描(index fast full scan)

扫描索引中的所有的数据块 与 index full scan很类似 但是一个显著的区别就是它不对查询出的数据进行排序 即数据不是以排序顺序被返回 在这种存取方法中 可以使用多块读功能 也可以使用并行读入 以便获得吞吐量与缩短执行时间

索引快速扫描的例子

BE_IX索引是一个多列索引

big_emp (empno ename) SQL> explain plan for select empno ename from big_emp; Query Plan SELECT STATEMENT[CHOOSE] Cost= INDEX FAST FULL SCAN BE_IX [ANALYZED]

只选择多列索引的第 列

SQL> explain plan for select ename from big_emp; Query Plan SELECT STATEMENT[CHOOSE] Cost= INDEX FAST FULL SCAN BE_IX [ANALYZED]

lishixinzhi/Article/program/Oracle/201311/17452

最后修改时间:
排序怎么从1排到100(排序怎么从1排到100函数)
上一篇
谁是最可爱的人背景战役 谁是最可爱的人
下一篇

相关文章