如何查看执行计划以及执行计划的准确性

下面的执行计划是怎么打印出来的,很多朋友还是不知道。其实语句只有三条:

explain plan for 你要查看的SQL语句;
commit;
select * from table(dbms_xplan.display);

-----分割线----------------------------------

先告诉大家一个原则,看执行计划的时候,从第一行开始向右下看,一直到最右边。如果有并列的,那么先上再下。如果没并列,右边的先执行。

闲话少说,先上图吧:

这是一个简单的SQL的执行计划,这个执行计划告诉我们,id=2的最先执行,然后是id=3的,然后执行id=1的。

首先对test进行一次全表扫描,这一步返回rows=2,CPU的消耗为2。接下来对test1进行一次全表扫描,这一次返回的rows为2,CPU的消耗为3。接下来对这两个结果进行一次哈希连接(hash join),返回rows=1,这里的CPU消耗为6,但是需要注意,这次是我的语句赶寸了,6=2X3,但是哈希连接需要的CPU COST绝对不会恰恰是之前执行的操作的CPU COST之积,特别说明一下。至此,我们的oracle对这个语句的执行计划结束。

这个执行计划是怎么得到的?既然是计划,那么绝对不是把这个语句先执行一遍,然后把这个计算出来,那样的话这个执行计划就成了事后诸葛亮了。这个执行计划是oracle根据统计信息得到的。那么这个执行计划就有可能不准,请大家看看我的语句以及执行出来的结果:

SELECT A.SER_ID, B.OWNER FROM TEST A, TEST1 B WHERE A.AREA_ID = B.OWNER;

结果如图:

怎么样?绝对不是6行那么点点东西吧?这个表的统计信息看来非常非常旧了。于是我对两个表重新进行统计:

ANALYZE TABLE TEST COMPUTE STATISTICS;

ANALYZE TABLE TEST1 COMPUTE STATISTICS;

然后再看看执行计划:

肿么样,这样就不是那么小了吧?test有12M行的返回。test1的owner字段只有两条记录:911和290。那么对应的test中area_id=290/911的有多少条记录呢?count一下:8485760,那么为什么是12M行呢?因为是全表扫描:

SELECT COUNT(*)/1024/1024 FROM TEST;

结果就是12。

现在可以总结一下了:执行计划的准确性(主要指数据返回,数据量大小)由统计信息的准确性决定。

如何查看执行计划以及执行计划的准确性

时间: 2024-08-02 20:54:12

如何查看执行计划以及执行计划的准确性的相关文章

win7计划任务执行BAT文件问题

今天下午做了一个调用java 可执行jar的程序,想通过win7的计划任务来调用 批处理命令: java -jar BIDropSyc.jar    或者 javaw -jar BIDropSyc.jar 但添加以后发现win7没有调用jar程序,单独点击批处理文件能执行.发现问题是由于没有添加批处理文件所在路径.在如下图框中添加上即可. win7计划任务执行BAT文件问题,布布扣,bubuko.com

windows server 2012 R2任务计划不执行解决方法

最近电话交换机天天出问题,每天都要重启一次才能好,我实在受不了了做了个脚本放服务器上,做了一个任务计划每天早上执行一次,手动执行完全没有问题,就直接放任务计划里面了. 第二天上服务器上一看出错了"函数不正确(0x80070001)",手动在任务计划里运行也是不行,奇怪了,最后发现这个地方要设置一下: 顺利执行!总结有可能是我的bat文件要去找vbs文件,然后不指定路径的话,系统会去环境变量里面去找(那肯定是没有的),所有任务计划不执行的朋友可以设置一下这个路径试试.

在WINDOWS中设置计划任务执行PHP文件的方法

在网上找了些WINDOWS执行PHP的计划任务的方法,有一个写得很全,可惜在我这竟然没通过.最后不得不综合各门派的方法,才能在我这运行成功 1.写一个PHP程序,命名为test.php,内容如下所示: 复制代码 代码如下: <? $fp = fopen("test.txt", "a+"); fwrite($fp, date("Y-m-d H:i:s") . " 成功成功了!\n"); fclose($fp); ?>

在WINDOWS中设置计划任务执行PHP文件

在网上找了些WINDOWS执行PHP的计划任务的方法,有一个写得很全,可惜在我这竟然没通过.最后不得不综合各门派的方法,才能在我这运行成功. 1.写一个PHP程序,命名为test.php,内容如下所示: 1   <? $fp = fopen("test.txt", "a+"); fwrite($fp, date("Y-m-d H:i:s") . " 成功成功了!n"); fclose($fp); ?>      

用windows计划任务执行一些内容的写法,

以下示例: 1.创建ws对象 2.关闭java进程 3.执行bat文件 start.vbe文件内容 set ws=wscript.createobject("wscript.shell")ws.run "taskkill /im java.exe /f", , Truews.run "cmd /c cd E:\server\james\bin & E: & E:\server\james\bin\run.bat" 用windows

目标计划及执行情况

计划目标 掌握的程度 时间 完成情况 备注 学习Web Api 能用,会用 2018年7月16日~2018年7月22日 0 学习Web Service 能用,会用 2018年7月9日~2018年7月15日 100% 成功做了个例子 2018年7月2日~2018年7月8日 0 继续完成上周任务 2018年6月25日~2018年7月1日 0 继续完成上周任务+简历 虽然不走,但要一份简历不断去填充完善 2018年6月18日~2018年6月24日 30 只实现了把ftp上的文件夹里的内容全部下载在本地

WINDOWS中设置计划任务执行PHP文件

1.写一个PHP程序,命名为test.php,内容如下所示: <? $fp = fopen("test.txt", "a+"); fwrite($fp, date("Y-m-d H:i:s") . " 成功成功了!\n"); fclose($fp); ?> 程序大胆地写,什么include\require尽管用,都没问题2.新建Bat文件,命名为test.bat,内容如下所示: D:\php\php.exe -q

Linux学习笔记(三):系统执行级与执行级的切换

1.Linux系统与其它的操作系统不同,它设有执行级别.该执行级指定操作系统所处的状态.Linux系统在不论什么时候都执行于某个执行级上,且在不同的执行级上执行的程序和服务都不同,所要完毕的工作和所要达到的目的也都不同. 2.Linux(Red Hat 9.0)设置了7个不同的执行级,系统能够在这些执行级别之间进行切换以完毕不同的工作. 3.接下来简介7个系统执行级: (1).执行级0:关闭计算机. (2).执行级1:单用户模式. (3).执行级2:多用户模式(不带网络文件系统NFS支持功能).

iOS: 零误差或极小误差的定时执行或延迟执行?

问题如下: 节奏类游戏需要执行很多的跟音乐节拍相关的操作,并且为了保证节奏感,需要让操作跟节拍的关系十分紧密.对两者间隔要求不能超过0.02秒或更低. 目前使用了 GCD 中的 asyncAfter(deadline:)方法,不过误差总是要大于0.05秒,并且还无法保证误差会不会传递下去.请问有更好的方式来解决误差吗? var time = Date().timeIntervalSince1970 let dq = DispatchQueue(label: "queue", qos: