怎么看 oracle 执行计划结果 显示结果一、通过PL/SQL Dev工具
1、直接File-New-Explain Plan Window,在窗口中执行sql可以查看计划结果 。其中,Cost表示cpu的消耗,单位为n% , Cardinality表示执行的行数,等价Rows 。
2、先执行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的执行计划了,看到的结果和1中的一样,所以使用工具的时候推荐使用1方法 。
注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令 。还有使用工具方法查看计划看到的信息不全,有些时候我们需要sqlplus的支持 。
二、通过sqlplus
1.最简单的办法
Sql set autotrace on
Sql select * from dual;
执行完语句后,会显示explain plan 与 统计信息 。
这个语句的优点就是它的缺点 , 这样在用该方法查看执行时间较长的sql语句时 , 需要等待该语句执行成功后,才返回执行计划 , 使优化的周期大大增长 。如果不想执行语句而只是想得到执行计划可以采用:
Sql set autotrace traceonly
这样,就只会列出执行计划,而不会真正的执行语句,大大减少了优化时间 。虽然也列出了统计信息,但是因为没有执行语句 , 所以该统计信息没有用处,如果执行该语句时遇到错误,解决方法为:
(1)在要分析的用户下:
Sqlplus@ ?
dbmsadminutlxplan.sql
(2) 用sys用户登陆
Sqlplus@ ?sqlplusadminplustrce.sql
Sqlplusgrant plustrace to user_name;
- - user_name是上面所说的分析用户
2.用explain plan命令
(1) sqlplusexplain plan for select * from testdb.myuser
(2) sqlplusselect * from table(dbms_xplan.display);
上面这2种方法只能为在本会话中正在运行的语句产生执行计划,即我们需要已经知道了哪条语句运行的效率很差,我们是有目的只对这条SQL语句去优化 。其实,在很多情况下,我们只会听一个客户抱怨说现在系统运行很慢,而我们不知道是哪个SQL引起的 。此时有许多现成的语句可以找出耗费资源比较多的语句,如:
SELECT ADDRESS, substr(SQL_TEXT,1,20) Text, buffer_gets, executions,
buffer_gets/executions AVG FROM v$sqlarea
WHERE executions0 AND buffer_gets100000 ORDER BY 5;
ADDRESS TEXT BUFFER_GETS EXECUTIONS AVG
-------- ---------------------------------------- ----------- ---------- ------------------------------------------------------------
66D83D64 select t.name, (sel 421531 60104 7.01336017
66D9E8AC select t.schema, t.n 1141739 2732 417.913250
66B82BCC select s.synonym_nam 441261 6 73543.5
从而对找出的语句进行进一步优化 。当然我们还可以为一个正在运行的会话中运行的所有SQL语句生成执行计划 , 这需要对该会话进行跟踪,产生trace文件,然后对该文件用tkprof程序格式化一下,这种得到执行计划的方式很有用 , 因为它包含其它额外信息,如SQL语句执行的每个阶段(如Parse、Execute、Fetch)分别耗费的各个资源情况(如CPU、DISK、elapsed等) 。
3、启用SQL_TRACE跟踪所有后台进程活动:
全局参数设置: .OracleHome/admin/SID/pfile中指定: SQL_TRACE = true (10g)
当前session中设置:
SQL alter session set SQL_TRACE=true;
SQL select * from dual;
SQL alter session set SQL_TRACE=false;
对其他用户进行跟踪设置:
SQL select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
128 54521 B
开启跟踪:SQL exec dbms_system.set_SQL_TRACE_in_session(127,31923,true);
关闭跟踪:SQL exec dbms_system.set_SQL_TRACE_in_session(127,31923,false);
然后使用oracle自带的tkprof命令行工具格式化跟踪文件 。
4、使用10046事件进行查询:
10046事件级别:
Lv1 - 启用标准的SQL_TRACE功能,等价于SQL_TRACE
Lv4 - Level 1绑定值(bind values)
Lv8 - Level 1等待事件跟踪
Lv12 - Level 1Level 4Level 8
全局设定:
【oracle怎么查询结果 oracle怎么查询一条数据】OracleHome/admin/SID/pfile中指定: EVENT="10046 trace name context forever,level 12"
当前session设定:
开启:SQL alter session set events '10046 trace name context forever, level 8';
关闭:SQL alter session set events '10046 trace name context off';
对其他用户进行设置:
SQL select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
SQL exec dbms_system.set_ev(127,31923,10046,8,'A');
5、使用tkprof格式化跟踪文件: (根据下面SQL语句得到的文件都不存在该目录下,郁闷啊,懵懂啊...)
一般,一次跟踪可以分为以下几步:
1、界定需要跟踪的目标范围,并使用适当的命令启用所需跟踪 。
2、经过一段时间后 , 停止跟踪 。此时应该产生了一个跟踪结果文件 。
3、找到跟踪文件 , 并对其进行格式化,然后阅读或分析 。
--使用一下SQL找到当前session的跟踪文件:
SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_namefrom( select p.spid from v$mystat m,v$session s, v$process pwhere m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,( select t.instance from v$thread t,v$parameter vwhere v.name = 'thread' and (v.value = https://www.04ip.com/post/0 or t.thread# = to_number(v.value))) i,( select value from v$parameter where name ='user_dump_dest' ) d;-- 其它用户的 session SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name from ( select p.spid from v$session s, v$process p where s.sid= '27' and s. SERIAL#= '30' and p.addr = s.paddr) p, ( select t.instance from v$thread t,v$parameter v where v.name = 'thread' and (v.value = https://www.04ip.com/post/0 or t.thread# = to_number(v.value))) i, ( select value from v$parameter where name ='user_dump_dest' ) d;
--查找后使用tkprof命令,将TRACE文件格式为到D盘的explain_format.txt文件中
SQL $tkprof d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc d:/explain_format.txt
文件内容大致如下(看不太懂....懵懂啊.....天啊....神啊.....过几时就懂了/////////////)
TKPROF: Release 9.2.0.1.0 - Production on 星期二 4月 20 13:59:20 2010
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Trace file: d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc
Sort options: default
********************************************************************************
count = number of times OCI procedure was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call********************************************************************************
alter session set events '10046 trace name context forever, level 8'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 0 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 1 0.00 0.00 0 0 0 0
Misses in library cache during parse: 0
Misses in library cache during execute: 1
Optimizer goal: CHOOSE
Parsing user id: SYS
oracle如何返回指定行数之间的查询结果如何返回指定行数之间的查询结果 以实现web记录分页 在Oracle中有许多的方法 这里仅仅列出了 种 希望能对大家有所帮助 大家可以根据不同需要选择下面的script)select where rownum50 minus select ... where rownum30这个方法因为用到了minus操作符 , 所以速度会受影响 。2) SELECT results.* FROM( SELECT t2.*, rownum rownumber FROM( SELECT t.* FROM mv_table t WHERE ORDER BY col1) t2) resultsWHERE results.rownumber BEEEN 30 and 50 ORDER BY col1 这个方法是从一个论坛上看到的,没有亲自测试过3) 定义cursor x, 2.fetch x a,b,c; loop ...... end loop;其中用两个循环变量和一个FLAG变量 , 分别表示,当前的记录数,属于第几页的,及第一页面 。.WINGwit.ps;j:=to_number(kafyf);i:=1;open cx;loop fetch cx into col1,col2,col3,col4,col5,col6;if cx%NOTFOUND then exit; end if;if i=j thenhtp.tableRowOpen;htp.tableData(col1);htp.tableData(col2);htp.tableData(col4);htp.tableData(col5);htp.tableData(col6);htp.tableData(col3);htp.tableRowClose;i:=i 1;if i=j 10 then l:=1; exit; end if;else i:=i 1;end if;end loop;close x;该方法是名叫‘淼’的网友写的script , 他用到了Oracle web2kit中的OWA_UTIL package 。4)How can one page forward and backwards through a table? Externalize ROWNUM by implementing queries like this:SELECT ...FROM (SELECT ROWNUM rnum, ... FROM ...)WHERE rnum BEEEN :low AND :high AND rownum (:high :low1);where :low and :high are dynamically generated values depending on which result page the user is viewing. Typically, they are used to show "Next 15 matches", "Previous 15 matches" links at the bottom of each page.lishixinzhi/Article/program/Oracle/201311/17917
Oracle 10g如何实现高级查询 许多人愁不会Oracle 10g的高级查询,其实也是比较简单的 。在查询数据时,为了获取完整的信息就要将多个表连接起来 , 这也是关系数据库的一个重要特性---表之间存在的关系 。这种关系可以将表的数据联系起来 。多表查询就是根据这种关系,实现从多个表中获取数据还原信息 。下面这个图就是我将要操作的表结构 。
工具/材料
电脑
Oracle 10g
01
基本连接查询
在简单查询中我们一般只使用了from字句的一个表 , 然而在关系数据库中,表与表之间往往是存在关系的,这就是要求从多个表中检索数据,以输出更有意义的结果 。最简单的连接方式就是在select语句中,通过from子句使用多个表,并用逗号将不同的基本表隔开 。下面语句将商品信息表和供应商信息表连接起来,查询其中的商品名称,产地,供应商名称 。
02
但此时结果显示该查询语句共显示了200行记录,这显然是错误的 。因为仅仅通过select和from子句连接那么查询结果将是一个通过笛卡儿积生成的表 , 包含大量无意义的信息 。而where语句可以有效避免笛卡儿积的出现 。只有当两个表具有相同匹配的列时才返回结果集 。例如下面语句通过在where子句中使用连接条件,实现了每件商品名称,产地,供应商名称信息 。
03
但也要注意一个问题如果想要查询“供应商编号”应该怎么处理,因为两个表中都有“供应商编号” , 所以应该查询的时候限定一下,说明究竟是哪一个表中的 。
04
join连接查询
join用于连接两个不同的表,on用于给出这两个表之间的连接条件 。如果进一步限制查询范围,可以在后面添加where语句,下面示例使用从商品信息表和供应商信息表查询单价大于1200元的商品信息 。
05
并且join连接也可以实现两个以上的表查询,写语句的时候一个join对应一个on , 看下面的例子 。
06
自然连接查询
其实自然连接查询(natural join)就是更加方便的join连接查询,自然连接不必指定任何同等连接条件,系统将自动判断出具有相同名称的列然后形成匹配,但注意自然连接是根据两个表中同名的列而进行连接的,当列不同名时,自然连接将失去意义 。
07
集合操作查询
集合操作就是将两个或多个SQL查询结合构成符合查询 , 集合操作符有union(并集)、intersect(交集)、minus(差集) , 现在以union为例,union查询必须从每个表中读取相同的列 。
08
子查询
子查询和连接查询一样提供了使用单个查询访问多个表中的数据的方法,使用in关键字,意思是在in后面的集合中查询我们需要的,即in后面是限定条件 。
特别提示
注意在Oracle 10g中的标点符号是英文状态下的
oracle如何得到如下查询结果创建测试表:
create table a
(xth varchar2(7),
rq varchar2(8),
lx int,
bh varchar2(8),
sum int);
create table b
(xth varchar2(7),
rq varchar2(8),
lx int,
bh varchar2(8),
sum int);
insert into a values ('1111111','20180723',381,'00000236',10);
insert into a values ('2222222','20180723',121,'00000236',1);
insert into a values ('2222222','20180723',381,'00000236',702);
insert into b values ('1111111','20180723',381,'00000236',10);
commit;
执行:
select a.xth, a.rq, a.lx, a.bh, a.sum sum1, b.sum sum2
from a
full join b
on a.xth = b.xth
and a.rq = b.rq
and a.lx = b.lx
and a.bh = b.bh
结果:
其实full join在这里改成left join也可以,看具体需求吧
oracle 如何把数据库查询结果导出1、打开oracle数据库,点击登陆选项,点击文件选项,点击新建选项,最后点击sql窗口;
2、然后在sql窗口中进行编写sql语句的操作,勇sql语句进行查询出想要导出来的数值;
3、然后在查询出来数据的地方,不要选中数据,把鼠标放到空白单元格处进行鼠标右键操作 , 找到复制到Excel选项;
4、然后在复制到excel中选择想要保存的格式--作为xls保存 , 打开后则是excel形式的数据;
5、默认的保存路径--将鼠标放在excel名称上--会出现路径--根据路径打开即可 。
oracle怎么查询结果的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于oracle怎么查询一条数据、oracle怎么查询结果的信息别忘了在本站进行查找喔 。
推荐阅读
- 主播玩的射击游戏,主播玩的射击游戏
- cpu什么频率好,cpu的频率是多少
- 海洋解谜游戏,海洋解谜游戏攻略
- 抖音直播软件噪音太大,抖音直播软件噪音太大怎么办
- Java代码排版规范 java程序代码的规范排版
- 公众号的文章怎样点亮,公众号怎么点
- 鸿蒙系统比安卓耗电,鸿蒙系统比安卓费电
- 鸿蒙系统阴阳手机,手机版鸿蒙
- php在哪里请求数据 php 请求