- 浏览: 566598 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
a1641693970:
还不错,学习了
BeanUtils使用总结(二)LazyDynaBean -
zjfshowtime:
很好的办法,学习了。
ORA-28001: the password has expired -
ya654277yo:
哦,多谢分享
Apache整合Tomcat后get方式提交中文乱码问题解决 -
foolkeeper:
nice !!
jvm内存参数设定 -
tracy821:
谢谢了,找了好久才找到
关于Spring 声明式事务处理时,throws exception不回滚的问题
(转)查看执行计划
- 博客分类:
- Database
Oracle10g获取sql语句的执行计划详解
---
Oracle诊断或调优经常需要做的就是查看SQL语句的执行计划,很多时候我们需要得到sql语句在不同场景、不同时间段的执行计划。
explain plan的命令格式如下:
sql>Explain plan <set statement_id = ‘text’> <into your plan table> for sql statement;
蓝色部分(<>中)可以省略;红色部分为具体sql语句
"set statement_id = ‘text’” ,其中statement_id是plan_table.statement_id,标记该条sql的id信息;
"into your plan table”,默认的plan table是plan_table
例如:
SQL> Explain plan set statement_id = 'dd' into plan_table for select * from cmdba.cmcdms t where t.code_item_no='031' and t.code='1B';
已解释。
通过explain plan command获得sql语句的执行计划,最大的优点是不用直接运行sql语句,避免了由于返回结果时间过长过多带来的等待。
0,通过PL/SQL查看
1) 需要先运行@$ORACLE_HOME/rdbms/admin/utlxpls.sql语句,生成plan_table.
2) 执行explain plan命令获得sql语句的执行计划。
SQL> Explain plan set statement_id = 'dd' into plan_table for select * from cmdba.cmcdms t where t.code_item_no='031' and t.code='1B';
注意,执行完成后要提交,才能在plan_table中查看到。
提交后,在PLAN_Table中可以查看到相关的记录。
3)查看sql执行计划:select * from plan_table where statement_id='dd'
sql命令如下:
sql>select plan_table_output from table(dbms_xplan.display_cursor(‘sql_id’));
注意:sql_id可以通过v$sql 视图获得。另外,v$sql_plan_statistics_all记录着sql语句的统计信息,也可以结合该视图查看到历史sql的执行计划。
如查询上述sql语句的sql_ID:select sql_id from v$Sql where sql_text like 'select * from cmdba.cmcdms t where t.code_item_no=%'
得到sql_id=4skqqxzg5qkz9,查询执行计划:
SQL> select plan_table_output from table(dbms_xplan.display_cursor('4skqqxzg5qkz9'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 4skqqxzg5qkz9, child number 0
-------------------------------------
select * from cmdba.cmcdms t where t.code_item_no='031' and t.code='1B'
Plan hash value: 3600018637
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| T
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)|
| 1 | TABLE ACCESS BY INDEX ROWID| CMCDMS | 1 | 71 | 2 (0)| 0
|* 2 | INDEX UNIQUE SCAN | PK_CMCDMS | 1 | | 1 (0)| 0
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T"."CODE_ITEM_NO"='031' AND "T"."CODE"='1B')
19 rows selected
同样也需要在v$sql 视图中查询出sql_id。
然后通过sql_id查询执行计划:
select * from V$SQL_PLAN where sql_id='4skqqxzg5qkz9'
Oracle9i新引入的包dbms_xplan
Oracle9i新引入的包dbms_xplan。函数display有三个参数:Table_name——执行计划所存放的表,默认为PLAN_TABLE;STATEMENT_ID——PLAN_TABLE表中的字段;FORMAT——显示格式。
--------------------------------------------------------------------------------
Plan hash value: 3600018637
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| T
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 71 | 2 (0)| 0
| 1 | TABLE ACCESS BY INDEX ROWID| CMCDMS | 1 | 71 | 2 (0)| 0
|* 2 | INDEX UNIQUE SCAN | PK_CMCDMS | 1 | | 1 (0)| 0
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T"."CODE_ITEM_NO"='031' AND "T"."CODE"='1B')
首先执行脚本
SQL>@D:oracleora92rdbmsadminutlxplan.sql 建立plan_table表
SQL> set autotrace on
SQL> set autotrace traceonly
SQL> set timing on
SQL> select * from cmdba.cmcdms;
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=9 Card=3327 Bytes=23
6217)
Bytes=236217)
----------------------------------------------------------
0 recursive calls
0 db block gets
256 consistent gets
0 physical reads
0 redo size
351787 bytes sent via SQL*Net to client
24956 bytes received via SQL*Net from client
446 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3327 rows processed
SQL> select * from v$parameter;
Execution Plan
----------------------------------------------------------
Plan hash value: 1128103955
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 926 | 1 (100)| 00:00:01 |
|* 1 | HASH JOIN | | 1 | 926 | 1 (100)| 00:00:01 |
|* 2 | FIXED TABLE FULL| X$KSPPI | 1 | 249 | 0 (0)| 00:00:01 |
| 3 | FIXED TABLE FULL| X$KSPPCV | 100 | 67700 | 0 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("X"."INDX"="Y"."INDX")
filter(TRANSLATE("KSPPINM",'_','#') NOT LIKE '#%' OR
"KSPPSTDF"='FALSE' OR BITAND("KSPPSTVF",5)>0)
2 - filter("X"."INST_ID"=USERENV('INSTANCE') AND
TRANSLATE("KSPPINM",'_','#') NOT LIKE '##%')
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
SET AUTOTRACE ON ----------------- 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不显示查询输出
这种方法显示内容较多……
在pl/sql或者sqlplus中,打开一个sql_window。
(1)先运行:alter session set sql_trace=true;
(2)再运行你那个返回结果不正确的SQL
(3)再运行:alter session set sql_trace=false;
(4)马上登陆到机器上,到$ORACLE_BASE/admin/sid/udump目录下。
(5)找到刚生成的.trc文件(假设文件名是 xxx.trc),
执行命令转储跟踪文件:tkprof xxx.trc aa.txt。
查看aa.txt文件。这个文件里面有执行计划。看看执行计划每一步返回的结果集记录数是不是正确。
(TTT:在udump目录下未找到新生成的*.trc,但在$ORACLE_BASE/admin/sid/bdump下找到相关文件,转储成功。oracle8i在$ORACLE_BASE\rdbms\trace\目录下。)
在pl/sql或者sqlplus中,打开一个sql_window。
(1)先运行:Alter session set events’10053 trace name context forever[,level {1/2}]’;
(2)再运行你那个返回结果不正确的SQL
(3)再运行:Alter session set events’10053 trace name context off’;
(4)马上登陆到10.1.4.10机器上,到$ORACLE_BASE/admin/sid/udump目录下。找到刚生成的.trc文件)。
8. 通过AWRRPT查看
(TTT:未测试)
同其他方式一样,要想获得sql语句的执行计划,必须获得该sql的sql_id。有了sql_id,并且确认该sql已经被记录在
dba_hist_sqltext里,你就可以使用oracle10g提供的dbms_xplan.display_awr包显示指定sql_id的执行
计划。
比如,执行一条sql,通过awrrpt获取其执行计划的步骤如下:
1)执行sql语句
sql>select /*awrshow*/ id from test order by id;
2)确认sql语句的sql_id
sql>select sql_id,sql_text from v$sql where sql_text like '%awrshow%';
3)确认该sql是否被记录在dba_hist_sqltext里
sql>select sql_id,sql_text from dba_hist_sqltext where sql_id = '****';
注意:如果没有该sql的信息,则手工设置AWR的snapshot,将sql信息记录在dba_hist_sqltext里。执行如下sql命令:
sql>exec dbms_workload_repository.create_snapshot();
4)使用dbms_xplan.display_awr的包显示指定sql_id的执行计划
sql>select plan_table_output from table(dbms_xplan.display_awr('sql_id'));
结合AWRRPT功能查看sql语句的执行计划最大的用处就是,当业务出现瓶颈或是峰值时,你可以获得异常时间段内问题sql语句的执行计划与正常表现时的进行对比。当然前提是,数据库是Oracle10g及以上版本,并使用了AWRRPT功能。
最近研究SQL调优,mark一下,感谢:http://huchen0907.iteye.com/blog/1249484
发表评论
-
Oracle数据库的锁类型(转)
2014-05-08 14:05 1086Oracle数据库的锁类型 o ... -
AWR报告手动生成
2014-04-12 12:23 954sqlplus / as sysdba SQL> ... -
PowerDesigner脚本生成
2013-11-23 17:04 8191 PowerDesigner中批量根据对象的name生 ... -
EXP-00011:oracle11g 空表不能exp导出的问题
2013-05-23 10:51 1358环境:Oracle11gR2+linux RH 5.5 最 ... -
新建Oracle数据库2种方法
2013-03-14 15:53 1080新建Oracle数据库2种方法:1.通过运行Oracle ... -
(转)ORACLE 数据库(查询--主键外键约束)
2012-05-15 15:50 2069-- 查询外键约束(查某表的所有父表) sel ... -
(转)Redhat Linux安装Oracle 11g R2数据库
2012-04-04 22:17 1694Oracle目前最新的版本是11g R2版本,网上不少安装介绍 ... -
ORA-28001: the password has expired
2012-02-23 13:47 9432大早上正式库提示: Oracle提示错误消息ORA-28 ... -
linux自动备份数据库
2012-02-13 18:08 987#!/bin/sh export PATH=$PATH:$H ... -
Oracle中使用sys_connect_by_path函数实现行转列
2012-01-09 20:16 1331select category ,MAX(s ... -
Oracle强杀进程,解决表锁死等问题
2011-10-17 17:49 11511、找到sid,serial#; SELECT /*+ ... -
Oracle常用技巧(转)
2011-10-11 14:39 9871.删除表空间 DROP TABLESPACE ... -
查询oracle表的信息(表,字段,约束,索引)
2011-08-09 12:22 10891、查询出所有的用户表 select * fro ... -
Oracle index
2011-08-09 12:19 1100索引: 1、一般索引: create inde ... -
(转)oracle执行计划
2011-07-20 19:23 1056一.相关的概念 ... -
ORA-01658 表空間大小不足
2011-02-22 12:24 1297解決方法: 1.查詢各個表空間的利用率 sele ... -
(转)ORACLE数据导入导出
2011-02-19 15:45 871Oracle数据导入导出imp/exp就相当于oracle数据 ... -
Oracle 10g 安装之网络适配器要求 Microsoft Loopback Adapter (环回适配器)
2011-02-19 15:36 4627安装10g的时候,遇到了 ... -
【ORA-12560: TNS: 协议适配器错误】解决方案
2011-02-19 14:42 1327ORA-12560: TNS: 协议适配器错误的问题的原因有三 ... -
SQL优化34条
2010-07-05 12:47 7991) 选择最有效率的表名顺序(只在基于规则的优化器中有效):O ...
相关推荐
网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多... 今天来探索下MSSQL的执行计划,来让大家知道如何查看MSSQL的优化机制,以此来优
重点讲解执行计划在SQL语句执行的生命周期中所处的位置和作用,SQL引擎如何生成执行计划以及如何获取SQL语句的执行计划,如何从各种数据源显示和查看已经生成的执行计划。, 第二篇“SQL优化技术”深入分析Oracle的...
重点讲解执行计划在sql语句执行的生命周期中所处的位置和作用,sql引擎如何生成执行计划以及如何获取sql语句的执行计划,如何从各种数据源显示和查看已经生成的执行计划。 第二篇“sql优化技术”深入分析oracle的...
重点讲解执行计划在SQL语句执行的生命周期中所处的位置和作用,SQL引擎如何生成执行计划以及如何获取SQL语句的执行计划,如何从各种数据源显示和查看已经生成的执行计划。 第二篇“SQL优化技术”深入分析Oracle的SQL...
第1部分中以影响数据读取效率的所有要素为类别,对其各自的概念、原理、 特征、应用准则,以及表的结构特征、多样化的索引类型、优化器的内部作用、优化器为各种结果制定的执行计划予以详细说明,并以对优化器的...
第1部分中以影响数据读取效率的所有要素为类别,对其各自的概念、原理、 特征、应用准则,以及表的结构特征、多样化的索引类型、优化器的内部作用、优化器为各种结果制定的执行计划予以详细说明,并以对优化器的...
在查看执行计划过程中如果有什么不明白的地方,可以点中“SQL信息按钮”,再在执行计划看不明白的地方点 击下,LECCO SQL Expert的上下文敏感帮助系统将提供执行计划该处的解释(如图7)。 优化模块的特点 LECCO SQL...
6.2.2 查看相关执行计划 149 6.2.3 收集执行计划统计信息 151 6.2.4 标识SQL语句以便以后取回计划 153 6.2.5 深入理解DBMS_XPLAN的细节 156 6.2.6 使用计划信息来解决问题 161 6.3 小结 169 第7章 高级分组 ...
请检查系统用户是否为管理员,如果是,不要急,再查看一下UCA是否打开,如果打开请关闭,如果已经关闭,请在检查一下注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System] ...
作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。...查看SQL执行计划
如果您希望执行最佳实践或执行最佳做法,那么更好的选择可能是分析源terraform代码,而不是仅查看terraform plan输出描述的更改。用法JavaScript API NPM: npm install terraform-plan-parser 纱线包装管理器:
7.4 练习四: MySQL 中如何查看sql语句的执行计划?可以看到哪些信息?(难度:中等) 7.5 练习五: 解释一下 SQL 数据库中 ACID 是指什么?(难度:中等) ch08:秋招秘籍 C 8.1 练习一: 行转列(难度:中等) ...
定期执行数据库备份任务,取代SSMS的维护计划,上传数据库备份文件到FTP服务器、其他网络硬盘等 支持SQLSERVER版本:SQLSERVER2000、SQLSERVER2005、SQLSERVER2008、SQLSERVER2008 R2、SQLSERVER2012 当你的电脑是 ...
这是最基础的步骤,需要对sql执行explain查看执行计划中是否用到了索引,需要重点关注type=ALL, key=NULL的字段。 2. 在索引字段上施加函数 to_char(gmt_created, ‘mmdd') = '0101′ 正确的写法 gmt_created ...
我们知道MySQL的性能优化方法,一般有建立索引、规避复杂联合查询、设置冗余字段、建立中间表、查询缓存等,也知道用EXPLAIN来查看执行计划。 但对MySQL复杂查询语句执行过程和内部机制,MySQL Optimizer本身所做...
bin指用二进制方式传送(可执行文件进);默认为ASCII格式传送(文本文件时) route print 显示出IP路由,将主要显示网络地址Network addres,子网掩码Netmask,网关地址Gateway addres,接口地址Interface arp ...
机器人,用于关于计划旅行的快节奏群聊。 什么是 TravelBoet? TravelBoet 是一个用于电报的聊天机器人,可以获取有关航班、地点和汇率的信息。 它是如何工作的? TravelBoet 将在给定的聊天中(直接与他或在您邀请...
最近使用Serv-U来架设FTP服务器,用于文件传输的桥梁。好景不长,每隔一段时间,Serv-U的服务就会自动停止。因为这个ftp服务很重要,要保证每天都能正常工作,如果只靠人每天来...设置执行计划,每30分钟执行一个批处理
1.28. 查看SQL的执行计划 74 1.29. 如何查看数据库ABC的配置文件的内容? 75 1.30. 查看是哪张表挂起(原) 75 1.31. 导出(导入)数据库的所有表数据(db2move) 75 1.32. 备份数据库,恢复数据库 75 1.33. 建立数据库、...