优化实例- not in 和 not exists
客户运行一个SQL,非常慢。于是进行了一下改写。速度飞快,首先看一下原来的SQL。
original sql
SQL> explain plan for
2 select count(*) from pnadmin.si_vsl where vsl_status_i = 'A' and to_number(vsl_id_n) not in (select vessel_id from pnadmin.vessel_master); Explained. SQL> select * from table(dbms_xplan.display()); PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3613440888 -------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 9 | 9466K (4)| 31:33:15 |
| 1 | SORT AGGREGATE | | 1 | 9 | | |
|* 2 | FILTER | | | | | |
|* 3 | TABLE ACCESS FULL| SI_VSL | 35069 | 308K| 642 (5)| 00:00:08 |
|* 4 | TABLE ACCESS FULL| VESSEL_MASTER | 1 | 5 | 352 (4)| 00:00:05 |
------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - filter( NOT EXISTS (SELECT 0 FROM "PNADMIN"."VESSEL_MASTER"
"VESSEL_MASTER" WHERE LNNVL("VESSEL_ID"<>TO_NUMBER(:B1))))
3 - filter("VSL_STATUS_I"='A')
4 - filter(LNNVL("VESSEL_ID"<>TO_NUMBER(:B1))) 19 rows selected.
可以看到是filter 操作。 filter操作在之前的blog中有介绍(http://www.cnblogs.com/kramer/archive/2013/04/12/3017013.html)。 这是一个类似于nested loop的操作,可以理解为对SI_VSL的每一行都要对VESSEL_MASTER做一次全表扫描,所以这个很显然是会非常慢的。 于是想到如果用hash join可能会快很多。 两种办法,一种是改写,一种是用 hash hint。 我用的是改写
new sql
SQL> explain plan for
2 select count(*) from PNADMIN.si_vsl a where a.vsl_status_i = 'A' and not exists (select 1 from PNADMIN.vessel_master b where b.vessel_id=to_number(a.vsl_id_n)); Explained. SQL> select * from table(dbms_xplan.display()); PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3198032547 -------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 14 | 995 (4)| 00:00:12 |
| 1 | SORT AGGREGATE | | 1 | 14 | | |
|* 2 | HASH JOIN ANTI | | 35067 | 479K| 995 (4)| 00:00:12 |
|* 3 | TABLE ACCESS FULL| SI_VSL | 35069 | 308K| 641 (5)| 00:00:08 |
| 4 | TABLE ACCESS FULL| VESSEL_MASTER | 74163 | 362K| 348 (3)| 00:00:05 |
------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("B"."VESSEL_ID"=TO_NUMBER("A"."VSL_ID_N"))
3 - filter("A"."VSL_STATUS_I"='A')
新的SQL用hash 非常快。 但是我想通过hash hint的方式修改原sql 效果不好。 也许是因为对hash hint理解不深,明天好好研究一下。
--
后来发现 hash_aj hint在 oracle10g中不支持了。 同样的还有很多
The AND_EQUAL
, HASH_AJ
, MERGE_AJ
, NL_AJ
, HASH_SJ
, MERGE_SJ
, NL_SJ
, EXPAND_GSET_TO_UNION
, ORDERED_PREDICATES
, ROWID
, and STAR
hints have been deprecated and should not be used. 详细请看下面的URL
http://docs.oracle.com/cd/B13789_01/server.101/b10752/whatsnew.htm
OK 既然hash hint不支持了 我们就不再纠结了 。 本文只要记得 至少在10g里面 通过 not in exist 等的转换还可以获得不同的执行计划就好了。
优化实例- not in 和 not exists的更多相关文章
- MySQL优化实例
这周就要从泰笛离职了,在公司内部的wiki上,根据公司实际的项目,写了一些mysql的优化方法,供小组里的小伙伴参考下,没想到大家的热情很高,还专门搞了个ppt讲解了一下. 举了三个大家很容易犯错的地 ...
- mysql 优化实例之索引创建
mysql 优化实例之索引创建 优化前: pt-query-degist分析结果: # Query 23: 0.00 QPS, 0.00x concurrency, ID 0x78761E301CC7 ...
- mysql sql优化实例
mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...
- (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...
- MySQL索引优化实例说明
下面分别创建三张表,并分别插入1W条简单的数据用来测试,详情如下: [1] test_a 有主键但无索引 CREATE TABLE `test_a` ( `id` int(10) unsign ...
- 一条经典SQL语句优化实例
1.概述 如下SQL语句发生严重消耗资源的问题,使得OS's load average会在30以上,一条语句需要执行上百秒. /*PIXPatient 184176条DomainPatient 184 ...
- mysql优化---in型子查询,exists子查询,from 型子查询
in型子查询引出的陷阱:(扫更少的行,不要临时表,不要文件排序就快) 题: 在ecshop商城表中,查询6号栏目的商品, (注,6号是一个大栏目) 最直观的: mysql); 误区: 给我们的感觉是, ...
- Android ListView性能优化实例讲解
前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...
- Nginx+PHP优化实例
1.PHP-FPM高负载的解决办法 http://blog.haohtml.com/archives/11162 2.Nginx优化配置 http://blog.haohtml.com/archive ...
随机推荐
- 学习c语言的感想
其实个人认为无论学习什么语言,最重要的是掌握习编程思想,然而C语言一种学习编程思想的基础语言.所以,C语言的重要性不言而喻. 一.课本 无论用的是什么书,要学好C语言,把书上的每一个例题.习题的代码读 ...
- jQuery使用手册,【新手必备】
jQuery是一款同prototype一样优秀js开发库类,特别是对css和XPath的支持,使我们写js变得更加方便!如果你不是个js高手又想写出优 秀的js效果,jQuery可以帮你达到目的! ...
- B树、B+树、红黑树、AVL树比较
B树是为了提高磁盘或外部存储设备查找效率而产生的一种多路平衡查找树. B+树为B树的变形结构,用于大多数数据库或文件系统的存储而设计. B树相对于红黑树的区别 在大规模数据存储的时候,红黑树往往出现由 ...
- Android开发初体验
本文通过开发一个应用来学习Android基本概念及构成应用的UI组件. 开发的应用名叫GeoQuiz,它能给出一道道地理知识问题.用户点击true或false按钮回答问题,应用即时做出反馈 第一步请先 ...
- Android项目实战_手机安全卫士拦截骚扰
###1.骚扰拦截需求分析1.界面1.1 黑名单列表界面1.2 添加黑名单界面2.功能2.1 黑名单的添加.删除2.2 拦截电话2.3 拦截短信 ###2.黑名单数据库的创建1.分析需要的字段id 主 ...
- 微信小程序php后台实现
这里简单介绍用php后台实现获取openid并保存到数据库: 微信的登陆流程是这样的 首先前端发送请求到服务器: wx.login({ success: function (res) { var co ...
- Java_Web三大框架之Hibernate配置文件(二)
下面介绍一下编写Hibernate的配置文件,使用Hibernate操作数据库. 开始部署:下载需要的jar包 下载Hibernate Hibernat ...
- input按钮的事件处理大全
input按钮的事件处理大全 input按钮的事件处理大全1.<INPUT onclick=document.all.WebBrowser.ExecWB(1,1) type=button v ...
- 报错:command not found
linux中如果是最小化安装的系统,执行命令的时候很多会出现没找到命令 [root@localhost ~]# mtr -bash: mtr: command not found [root@loca ...
- BZOJ 2850: 巧克力王国 KDtree + 估价函数
Code: #include<bits/stdc++.h> #define maxn 100000 #define inf 1000000008 #define mid ((l+r)> ...