客户运行一个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_EQUALHASH_AJMERGE_AJNL_AJHASH_SJMERGE_SJNL_SJEXPAND_GSET_TO_UNIONORDERED_PREDICATESROWID, 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的更多相关文章

  1. MySQL优化实例

    这周就要从泰笛离职了,在公司内部的wiki上,根据公司实际的项目,写了一些mysql的优化方法,供小组里的小伙伴参考下,没想到大家的热情很高,还专门搞了个ppt讲解了一下. 举了三个大家很容易犯错的地 ...

  2. mysql 优化实例之索引创建

    mysql 优化实例之索引创建 优化前: pt-query-degist分析结果: # Query 23: 0.00 QPS, 0.00x concurrency, ID 0x78761E301CC7 ...

  3. mysql sql优化实例

    mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...

  4. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...

  5. MySQL索引优化实例说明

    下面分别创建三张表,并分别插入1W条简单的数据用来测试,详情如下: [1] test_a 有主键但无索引   CREATE TABLE `test_a` (   `id` int(10) unsign ...

  6. 一条经典SQL语句优化实例

    1.概述 如下SQL语句发生严重消耗资源的问题,使得OS's load average会在30以上,一条语句需要执行上百秒. /*PIXPatient 184176条DomainPatient 184 ...

  7. mysql优化---in型子查询,exists子查询,from 型子查询

    in型子查询引出的陷阱:(扫更少的行,不要临时表,不要文件排序就快) 题: 在ecshop商城表中,查询6号栏目的商品, (注,6号是一个大栏目) 最直观的: mysql); 误区: 给我们的感觉是, ...

  8. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  9. Nginx+PHP优化实例

    1.PHP-FPM高负载的解决办法 http://blog.haohtml.com/archives/11162 2.Nginx优化配置 http://blog.haohtml.com/archive ...

随机推荐

  1. codevs1486愚蠢的矿工(树形dp)

    1486 愚蠢的矿工  时间限制: 1 s  空间限制: 128000 KB     题目描述 Description Stupid 家族得知在HYC家的后花园里的中央花坛处,向北走3步,向西走3步, ...

  2. [Apple开发者帐户帮助]九、参考(4)支持的功能(macOS)

    macOS应用程序可用的功能取决于您的程序成员身份和签名证书. 能力 ADP 开发者ID Apple开发者 应用程序组 App沙盒 游戏中心     硬化运行时 iCloud:CloudKit   i ...

  3. [Apple开发者帐户帮助]八、管理档案(4)

    您可以编辑,下载或删除在开发人员帐户中创建的配置文件.例如,如果您撤消了证书或禁用了配置文件中包含的设备,请编辑配置文件.或重新置备的个人资料,如果因为你它是无效的功能的应用程式服务. 注意: Xco ...

  4. 发布 Windows 服务

    1. 如何新建 Windows 服务 打开VS,“新建项目”-->“windows 桌面”-->“windows 服务”: http://www.cnblogs.com/sorex/arc ...

  5. 题解报告:poj 3233 Matrix Power Series(矩阵快速幂)

    题目链接:http://poj.org/problem?id=3233 Description Given a n × n matrix A and a positive integer k, fin ...

  6. jsp文件就是Servlet,可以在tomcat里进行查看

    D:\apache-tomcat-8.0.21\work\Catalina\localhost\springmvc2\org\apache\jsp\index_jsp.class

  7. React Native 环境搭建踩坑

    React Native (web Android)环境搭建踩坑(真的是一个艰辛的过程,大概所有坑都被我踩了 官方文档地址 : https://facebook.github.io/react-nat ...

  8. 解决Android弹出软键盘导致的问题

    一.当Activity启动后EditText直接获取了焦点,此时软键盘会自动弹出,这种体验并不是很好,因此要做的Activity启动不自动弹出软键盘,只需要在Manifest中对应的Activity添 ...

  9. CSS——宠物demo

    注意:ul中自带padding值,需要清除. <!DOCTYPE html> <html lang="en"> <head> <meta ...

  10. [Windows Server 2008] 安装网站伪静态

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装IIS伪静 ...