Oracle10g获取sql语句的执行计划详解|Oracle Oracle基础 TTTBLOG
2010-03-0951070
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 dbms race目录下。)
在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文件)。
同其他方式一样,要想获得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功能。
2022-7-9 · Oracle 账号 提示:申请的Oracle 账号老是登录不成功。我们在下载Oracle JDK的时候,必须同意 Oracle 许可协议,然后再使用Oracle账号登录后方可下载,过程非常繁琐。为了 …
文章目录一、Sql语句基础二、Oracle中的主要的数据类型三、Sql语句分类四、SQL语句的书写规则注意五、输出结果中列标题的默认显示1、Sql*plus的默认显示2、iSql*plus的默认显示六、Oracle中简单的创建表新建表语句七、Oracle简单的删除表删除 ...
1、通常我们遇到oracle用户密码输入多次错误,那么改用户就会变锁定,那么解决方法很简单,如下: 使用plsql工具sys用户登录(亦可dos命令输入:sqlplus / as sysdba ) 解锁 ALTER USER 用户名 ACCOUNT UNLOCK; 2、那么遇到这种用户会被锁的情况,我们可以设置用户密码无限次尝试登录,而该用户不会被锁定: ALTER …
ORACLE 数据库系统能够在业内独占鳌头并不是空穴来风,下面我们来细数一下 ORACLE 数据库的优势所在:. 1. 完整的数据管理功能:. 2. 完备关系的产品:. 3. 分布式处理功能:ORACLE …
Oracle忘记用户密码: 1.打开cmd命令窗口 2.登录,输入命令: sqlplus/nolog 1 3.链接数据库,输入命令: conn/as sysdba 1 4.修改密码,输入命令: alter user 要修改密码的用户名 identified …
oracle 提示登录密码过期解决 1.登录到oracle的 服务器 2.切换到oracle 用户 3.设置到当前操作的实例名:export ORACLE_SID=XXX 4.连接数据库的命令行模式:sqlplus /nolog 5.sql: conn /as sysdba;用dba的身份登录...
2022-1-21 · Oracle 11G密码180天过期后的修改方法,oracle11g由于Oracle11G的新特性所致,经常会遇到使用sqlplus登陆oracle数据库时提示“ORA-28002: 7 天之后口令将过期”等情况。 …
连接单引号. || 运算符将连接包含在单引号中的字符串值,但并不直接说明如何在连接字符串的结果中添加单引号字符。. 我们来看一个相当简单的例子,它显示了如何使用 || 运算符 …
Oracle 提供全面的 Public Cloud 服务,云区域和数据中心网络遍布全球。立即深入了解 Oracle 区域和数据中心。 Oracle 云网络功能提供完全灵活性,让客户可以安全地连接到 Oracle 服务。客户既可通过站点到站点 VPN 从公共互联网建立安全连接,也可以通过 Oracle Cloud Infrastructure FastConnect 提供的专用高带宽 ...
Oracle数据库是一个关系数据库管理系统,Oracle数据库由Oracle公司生产和销售。Oracle数据库是第一个专为企业网格计算而设计的数据库。企业网格计算提供了最灵活,最经济的方式来管理信息和应用程序。
Oracle数据库 11g默认密码过期时间为180天过期 1、使用SQL语句查找密码过期用户所属的profile select username,profile from dba_users; 2、查看对应的概要文件( …
oracle默认账号与密码 --- oracle默认的账号是被锁定的,想要实现该账户的登录,必须解锁账户 3.用户密码的修改-- 在2.中的步骤操作之后 输入:alter user scott identified by 密码。例如 alter user scott identified by 123; 即将scott账户的密码修改为
Oracle 不仅提供性能卓越且具有高成本效益的数据库和多模型融合数据库管理系统,还提供内存中数据库、 NoSQL 和 MySQL 数据库。. 其中, Oracle Autonomous Database 能够简化关系数据库环境,减轻管理工作负担 — 无论是使用 Oracle Cloud@Customer 进行本地部署,还是在 ...
2021-5-21 · Oracle 在使用的过程中经常遇到密码过期,这种情况下应该如何才能再次正常连接数据库。 Oracle 11g 之前默认的用户时是没有密码过期的限制的,在Oracle 11g 中默认的profile …
2021-9-17 · 该楼层疑似违规已被系统折叠隐藏此楼查看此楼在设置Oracle密码时,我们经常会将密码设置的特别复杂(一般由字母、数字和特殊符号组成),值得注意的是,在有特殊符号时,修 …
Oracle的密码过期规则是用Profile来管理的,系统默认只有一个Profile(DEFAULT),该profile的密码过期规则为180天;而所有的用户都使用该DEFAULT …
2019-4-30 · Oracle密码过期怎么取消密码180天限制发布时间:2021-02-07 10:55:42来源:亿速云阅读:90作者:小新栏目:数据库小编给大家分享一下Oracle密码过期怎么取消密码180天限 …
解决方案:. 密码过期一般存在两种可能:. 由于Oracle中默认在default概要文件中设置了“PASSWORD_LIFE_TIME=180天”所导致。. 由于Oracle中默认在default概要文件中设置 …
一、修改数据库密码 1. 登录oralce数据库 su oracle 2. 以管理员身份登录 sqlplus / as sysdba 3. 更改密码 password JSSJTT 二、设置密码永不过 3. 将概要文件(如default)的密码有 …
密码已过期!所以现在需要做的事情只有两件: 1.修改密码的过期时间 2.修改/重置密码 这里分析一下为什么要这样做: 1.修改密码的过期时间:这是因为Oracle Database 11g 版 …
2019-3-11 · 问题现象: 今天在更改数据库数据的时候,程序报错了,如下: ORA-28001:the password has expired 问题分析: 很显然,报错原因就是: 密码已过期!所以现在需要做的事 …
如果Oracle密码过期已经过期了,首先需要修改密码,然后设置密码为无限期。 修改以sys用户登陆。 修改密码:alter user username identified by password 密码可以和之前的密码相同也可以不同。
Oracle密码策略基本设置 系统用的用户密码默认是180天,到期后提醒需要修改密码否则过期。主要系统用户:OUTLN、SYSMAN、SYSTEM、SYS、MGMT_VIEW、DBSNMP …
Oracle密码默认180天会过期,这样对于开发过程有些麻烦烦,所以需要去掉过期策略。第一步、查看用户的proifle是哪个,一般是default SELECT username,PROFILE FROM …
2011-3-23 · 修改ORACLE数据库密码有效期的方法修改方法在程序运行过程中,常常会因为数据库密码过期而使程序无法正常访问。为解决这一问题,可采用如下方法:1.查看用户的proifle是 …
修改oracle数据库密码为无限期. 1) 执行” alter profile default limit password_life_time unlimited;”. 2) 查询数据库密码的有效期是否更改为无限期. select * from dba_profiles where profile=DEFAULT and resource_name=PASSWORD_LIFE_TIME; 至此数据库用户密码由有效期修为为无限期操作完毕 ...
一、密码文件 作用:主要进行DBA权限的身份认证 DBA用户:具有sysdba,sysoper权限的用户被称为dba用户。 默认情况下sysdba角色中存在sys用 …
问题总在解决的时候提及,解决在思考中! 01、查看当前open用户 select username,account_status,expiry_date,profile from dba_users; 02、查看目前的密码过期策略 …
Oracle的用户密码默认是有过期时间的,通常默认180天。当用户的密码过期时,他们将无法使用Oracle数据库,必须修改密码以继续使用。下面是关于Oracle用户密码过期和修改密码有效期的详细解释 一、查询Oracle密码有效期
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 该参数实时生效,但是不作用于已过期的用户,对于已过期的用户,我们可以直接修改密码. …
MailMe :258145120@qq.com. 扫我微信. Share to: 个人简介 2007年开始从事Oracle DBA相关工作,2011年转型为互联网DBA主要负责MySQL以及一系列NoSQL相关的运维管理工作。. 目前围绕着MySQL、NoSQL、运维开发领域摸爬滚打中。. 联系方式 我的QQ:258145120MailMe:258145120@qq.com扫我微信.