在写sql时,在多表关联时,有时候容易把关联关系写错。一般情况下,该问题比较容易发现,但如果sql较长时,光靠眼力就比较难发现了。今天写了一个脚本,碰到该问题了。

第一版本的脚本如下:

select detail.commityear,
detail.commitmonth,
to_char((sysdate - 1), 'YYYYMM') statmonthid,
policy.corppkno,
product.prdtsubcatpkno,
product.pkno,
sum(loss_d.losssum) lossSum_FASH,
sum(claim_d.claimsum) claimSum_FASH,
sum(indemnity_d.indemnityRptDetail) indemnityRpt_FASH,
sum(recovery_d.recoverySumDetail) recoveryRpt_FASH
from F_T_DeclareDetail detail
join stdw.d_t_policy policy
on detail.policypkno = policy.pkno
join stdw.d_t_producttype product
on policy.policytypepkno = product.pkno
left join (select t.declaredetailpkno,
sum(nvl(t.losssumdetail, 0)) losssum
from stdw.f_t_lossdetail t
group by t.declaredetailpkno) loss_d
on detail.pkno = loss_d.declaredetailpkno
and loss_d.losssum > 0
left join (select claim.declaredetailpkno,
sum(nvl(claim.claimsumdetail, 0)) claimsum
from stdw.F_T_ClaimDetail claim
group by claim.declaredetailpkno) claim_d
on detail.pkno = claim_d.declaredetailpkno
and claim_d.claimsum > 0
left join (select declareDetailPkNo,
sum(nvl(indemnityRptDetail, 0)) indemnityRptDetail
from stdw.F_T_IndemnityDetail
group by declareDetailPkNo) indemnity_d
on detail.pkno = indemnity_d.declaredetailpkno
and indemnity_d.indemnityRptDetail > 0
left join (select declaredetailpkno,
sum(nvl(recoverySumDetail, 0)) recoverySumDetail
from stdw.F_T_RecoveryDetail
group by declaredetailpkno) recovery_d
on detail.pkno = indemnity_d.declaredetailpkno
and recovery_d.recoverySumDetail > 0
where product.pkno not in (7, 8, 12, 14, 38) /*有出运*/
and (loss_d.losssum is not null or claim_d.claimsum is not null or
indemnity_d.indemnityRptDetail is not null or
recovery_d.recoverySumDetail is not null) /*剔除没有报损等信息的数据*/
group by detail.commityear,
detail.commitmonth,
policy.corppkno,
product.prdtsubcatpkno,
product.pkno

执行后,发现半天没出来数。而且这些表中,数据量最大的表f_t_declaredetail也就几百万条,在极致情况下,最多返回几百万行数据。查看了下执行计划,发现执行计划和预计的不一样,而且预估的结果集相当大。执行计划如下:

根据图示,可以比较清楚的看到,表f_t_recoverydetail居然与其他的表做了内嵌循环关联,不可思议啊,而且返回的结果集,远超百万数量级,比f_t_declaredetail的数量级还大。起初以为是统计信息出了问题,查看了各表的统计信息,发现没有什么异常。

后来静下来想了想,返回的结果集肯定不会超过f_t_declaredetail的数据量,正好与f_t_recoverydetail关联时,数据量嗖地上去了,初步怀疑是关联的问题。可以回头看下sql代码,粗字体表明的地方就是问题所在:确实是表之间关联出了问题。

总结:有时候肉眼看不出来,就用执行计划看吧,还是有很大帮助的。呵呵

sql优化-提防错误关联的更多相关文章

  1. sql 优化

    1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表driving table)将被最先处 ...

  2. SQL 优化总结

    SQL 优化总结 (一)SQL Server 关键的内置表.视图 1. sysobjects         SELECT name as '函数名称',xtype as XType  FROM  s ...

  3. (转)SQL 优化原则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  4. 提高SQL查询效率(SQL优化)

    要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359   我们要做到不但会写SQL,还要做到 ...

  5. SQL优化法则小记

    SQL优化技巧 1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表 driving ta ...

  6. SQL优化(zhuan)

    转自:http://www.jfox.info/SQL-you-hua 数据库的优化问题 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出S ...

  7. SQL 优化原则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  8. [SQL]SQL优化34条

    我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! () 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到 ...

  9. sql优化点整理

    此文是我最早开始sql优化至今整理的小知识点和经常遇到的问题,弄懂这些对优化大型的sql会有不少帮助 ---------------------------------使用了多余的外连接------- ...

随机推荐

  1. UVA 10739 String to Palindrome(dp)

    Problem H String to Palindrome Input: Standard Input Output: Standard Output Time Limit: 1 Second In ...

  2. semaphore实现浏览器的读写原理

    在编程范式中的斯坦福大学的老师说了一个例子:好比世界上就只有一台互联网的服务器,当我们浏览网页的时候,就好比服务器进行了写操作,而浏览器则进行了读操作. 我如果用简单的伪代码c++写出来是这个样子的: ...

  3. asp.net2.0安全性(2)--用户个性化设置(1)--转载来自车老师

    在Membership表中可以存储一些用户的基本信息,但有的时候,我们需要记录的用户信息远远不止Membership表中提供的这些,如QQ.MSN.家庭住址.联系电话等等.那如何把这些用户信息记录到数 ...

  4. Eclipse用法和技巧八:自动添加try/catch块1

    站在编译器的角度来看,java中的异常可以分为两种,已检查异常和未检查异常.对于已检查异常比如IO操作,编译器会要求设置try/catch语句块,在eclipse中也只要使用帮助快捷键ctrl+1,就 ...

  5. hadoop 学习入门 一 云计算之旅

    一. 什么是云计算: 云计算是分布式计算.网格计算.并行计算.效用计算.网络存储.负载均衡.虚拟化.网络计算等传统计算技术的融合体. 二. 云计算的核心技术: 1 编程模型 2 海量数据分布存储技术 ...

  6. POJ 2594 Treasure Exploration(最小路径覆盖变形)

    POJ 2594 Treasure Exploration 题目链接 题意:有向无环图,求最少多少条路径能够覆盖整个图,点能够反复走 思路:和普通的最小路径覆盖不同的是,点能够反复走,那么事实上仅仅要 ...

  7. js实现class样式的修改、添加及删除的方法

    本文实例讲述了js实现class样式的修改.添加及删除的方法.分享给大家供大家参考.具体分析如下: 比较常见的js前端功能,通过修改标签的className实现相应的功能. 具体代码如下: <t ...

  8. catalan 数——卡特兰数(转)

    Catalan数——卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1) ...

  9. mysql 执行计划走索引

    <pre name="code" class="html">mysql> desc AssignClientManager; +------- ...

  10. 初识JAVA,对servlet的理解

    一.WEB开发的简单理解 Web开发是一个指代网页或站点编写过程的广义术语.网页使用 HTML.CSS 和 JavaScript编写.这些页面可能是类似于文档的简单文本和图形.页面也能够是交互式的,或 ...