一个执行计划解析的小问题分析

前几天,一个开发的同学让我帮忙做一个大查询,给了我一个数据列表,里面的ID有几万个,提供了一个SQL语句,看这情况还得我自己来解析生成相关的SQL了。
假设ID列表为:
T100
T200
T300
SQL语句为:
select peak_transaction_id,cash ,req_time  ,back_time  from peak_new.peak_detail where peak_transaction_id=?;
对我来说拼成动态SQL也是分分钟,但是这种方式不推荐,还是推荐使用数据的结果集方式来匹配。
所以我可以根据id拼接成insert语句,或者直接使用外部表来关联。表里只有一个字段id varchar2(30)
在运行语句之前我还是会照例来查看执行计划,如果太差我就提前想别的办法了。
执行计划着实让我大跌眼镜。一个简单的键值关联的语句,执行计划竟然如此的查,来看看瓶颈在哪里。

可以从谓词信息看出,里面做了数据类型的转换,根据ID这个字段值数据类型应该是varchar2,是不需要转换为number类型的。
但是通过执行计划看出,内部是做了数据类型的转换,最后这种关联方式的消耗竟然如此惊人。
我就感觉有些蹊跷,为什么会有这种差别,按理来说是不需要这种类型转换啊。
调用的SQL语句如下:
select TEST_transaction_id,cash ,req_time  ,back_time  from TEST_new.TEST_detail where TEST_transaction_id in (select id from tempdba.test);
发现问题的症结在于tempdba.test不是我刚刚创建的临时表,而是指向了一个已经存在的表。这个表的结构如下:

所以这个问题就有点意思了,tempdba.test虽然和属主下的表test同名,但是字段完全不同,在生成执行计划的时候竟然还能成功,这个也让人着实怀疑优化器处理执行计划是不是也有很多不足之处。
我使用了正确的schema之后,重新生成执行计划,这一次得到的预估结果还是在接受范围之内。我完全可以在备库去跑这个查询实现目标。

那么问题来了,是不是执行计划对于字段的校验存在疏漏呢,我们来简单测试几个小例子。
发现在常见的表关联中还是能够校验出来的。

再来看看exists的方式是否也有问题。发现也是可以检测出来的。

所以再回头看这个问题,就会发现在最开始的语句中。
select TEST_transaction_id,cash ,req_time  ,back_time  from
TEST_new.TEST_detail where TEST_transaction_id in (select id from
tempdba.test);
采用in的子查询的时候,对于子查询中的列可以和关联的表不同名,我们可以取别名来达到的兼容的目的,我想正是如此在执行计划中也会弱化了这方面的检查,严格来说,姑且算是一个bug吧。

时间: 2024-11-05 18:55:48

一个执行计划解析的小问题分析的相关文章

一个执行计划异常变更引发的Oracle性能诊断优化

最近有一个OLTP应用使用的Oracle数据库突然出现性能问题,DBA发现有一些delete语句执行时间骤长,消耗大量系统资源,导致应用响应时间变长积Q.   辅助信息: 应用已经很久未做过更新上线了. 据开发人员反馈,从之前的应用日志看,未出现处理时间逐步变长的现象. 这是一套RAC+DG的环境,11g的版本. 这次突然出现大量执行时间超长的SQL语句,是一条删除语句,delete from table where key1=:1 and key2=:2 and ...(省略此案例不会用到的其

一个执行计划异常变更的案例 - 外传之rolling invalidation

刚做完一次网络切换支持,得空写一篇,其实今儿取了巧,这篇文章是之前写过的,碰巧又是这次"执行计划异常变更"案例涉及的一个知识点,所以再次翻出来. 之前的几篇文章: <一个执行计划异常变更的案例 - 前传> <一个执行计划异常变更的案例 - 外传之绑定变量窥探> <一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法> 做性能测试,有一条SQL,使用了绑定变量,查看V$SQLAREA发现version_count是2, 查看V$SQL,发现有

Asp.Net(C#)自动执行计划任务的程序实例分析分享

 这篇文章主要介绍了Asp.Net(C#)自动执行计划任务的程序实例分析,有需要的朋友可以参考一下 在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQLAgent执行存储过程来实现,也可以采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是很好的解决方案.但是,对于Web应用程序来说,这些方法实现起来

一个执行计划异常变更的案例 - 外传之绑定变量窥探

上一篇文章<一个执行计划异常变更的案例 - 前传>(http://blog.csdn.net/bisal/article/details/53750586),介绍了一次执行计划异常变更的案例现象,这两天经过运行同事,以及罗大师的介绍,基本了解了其中的原因和处理方法,这个案例其实比较典型,涉及的知识点很多,有数据库新特性,有SQL相关的,还有应用数据质量问题,对于大师来说,是信手拈来的一次问题排查和处理,但至少对我这个仍旧艰难前行的初学者来说,值得回味的地方很丰富,所以有必要针对其中涉及的知识点

一个执行计划异常变更的案例 - 外传之聚簇因子(Clustering Factor)

之前的几篇文章: <一个执行计划异常变更的案例 - 前传> <一个执行计划异常变更的案例 - 外传之绑定变量窥探> <一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法> <一个执行计划异常变更的案例 - 外传之rolling invalidation> 这个案例中涉及到了聚簇因子,所以本篇文章是这个系列的又一篇外传,写过上面几篇后,感觉现在就像打怪,见着真正的大BOSS之前,要经历各种小怪的骚扰,之所以写着几篇文章,真是因为这个案例涉及了很多知

一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法

之前的几篇文章: <一个执行计划异常变更的案例 - 前传> <一个执行计划异常变更的案例 - 外传之绑定变量窥探> <一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法> <一个执行计划异常变更的案例 - 外传之rolling invalidation> <一个执行计划异常变更的案例 - 外传之聚簇因子(Clustering Factor)> 本篇外传主要介绍一些常用的执行计划查看方法. SQL的执行计划实际代表了目标SQL在Orac

一个执行计划异常变更的案例 - 外传之AWR

之前的几篇文章: <一个执行计划异常变更的案例 - 前传> <一个执行计划异常变更的案例 - 外传之绑定变量窥探> <一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法> <一个执行计划异常变更的案例 - 外传之rolling invalidation> <一个执行计划异常变更的案例 - 外传之聚簇因子(Clustering Factor)> <一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法> 作为一款成熟的

一个执行计划异常变更的案例 - 外传之SQL Profile(上)

之前的几篇文章: <一个执行计划异常变更的案例 - 前传> <一个执行计划异常变更的案例 - 外传之绑定变量窥探> <一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法> <一个执行计划异常变更的案例 - 外传之rolling invalidation> <一个执行计划异常变更的案例 - 外传之聚簇因子(Clustering Factor)> <一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法> <一个执

一个执行计划异常变更的案例 - 正传

之前的几篇文章: <一个执行计划异常变更的案例 - 前传> <一个执行计划异常变更的案例 - 外传之绑定变量窥探> <一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法> <一个执行计划异常变更的案例 - 外传之rolling invalidation> <一个执行计划异常变更的案例 - 外传之聚簇因子(Clustering Factor)> <一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法> <一个执