在写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. 跨服务器查询sql (摘要)

    首先推荐一个神作:http://www.cnblogs.com/daniel206/archive/2008/01/16/1041748.html 大神比较详细了.而且条理很清晰. 然后摘录一些其他的 ...

  2. paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制

    源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...

  3. [Warning] Aborted connection 11203 to db: 'ide' user: 'nuc' host: 'prd01.mb.com' (Got an error writi

    PS:一台物理机扯分了3个虚拟机,一个主db,一个主备,一个从备. 切换到0301的时候 Sep  6 09:16:16 prddb0301 mysqld: 130906  9:16:16 [Warn ...

  4. HTTP协议和web工作原理

    本章学完之后能干什么? 要把 知识点学好,那就需要把它相关的周边知识点了解全面 HTTP协议是web学习的核心!!! 学东东切忌只学配置,不学原理:只学会框架有什么用,要会自己写框架!! web学习直 ...

  5. 学习了LINUX下用C语言遍历文件夹,一些心得

    struct dirent中的几个成员: d_type:4表示为目录,8表示为文件 d_reclen:16表示子目录或文件,24表示非子目录 d_name:目录或文件的名称 具体代码如下,仅供参考 # ...

  6. <转载>CSS解决图片过大撑破DIV的方法

    DIV+CSS网页内容中如果插入大于DIV层宽度显示,过大的图片将会撑破网页宽度显示从而网页严重变形,您是否遇到过?这里DIVCSS5给大家介绍几种解决图片撑破撑开网页DIV层方法. 图片撑破宽度解决 ...

  7. [概念] js的函数节流和throttle和debounce详解

    js的函数节流和throttle和debounce详解:同样是实现了一个功能,可能有的效率高,有的效率低,这种现象在高耗能的执行过程中区分就比较明显.本章节一个比较常用的提高性能的方式,通常叫做&qu ...

  8. list view Item 里面有ImageButton

    list view Item 里面有ImageButton listview 的item中有ImageButton, 或者 Button. 目的: ImageButton 和 Button的click ...

  9. Computational Geometry Template

    顿时觉得神清气爽!! #include <iostream> #include <math.h> #define eps 1e-8 #define zero(x) (((x)& ...

  10. 积累的VC编程小技巧之框架窗口及其他

    1.修改主窗口风格 AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名.窗口是叠加型的.可改变窗口大小等.要修改窗口的缺省风格,需要重载CWnd::Pre ...