http://blog.csdn.net/u012388497/article/details/17217705

问题描述

项目里有些报表出来的速度特别慢,尽管对润乾报表和Oracle数据库做了很多优化,效果还是不理想,这些报表普遍数据量比较大,涉及到的数据库表多(几十张)、表间关联频繁(还有自连接),报表里也有多个汇总、比值等计算。

以其中一个明细报表为例,它的SQL如下:

(select *

from (select syb.org_abbn as syb,

max(xmb.org_abbn) as xmb,

sub.org_subjection_id as sub_id,

oi.org_abbn as org_abb,

rm.rec_notice_org_id,

rm.synergic_team as xz_team,

xzdw.coding_name as xz_org,

l.requisition_cd as req_cd,

l.requisition_id as req_id,

l.note as req_note,

nvl(decode(l.ops_content6,

2000200012,

'否',

2000200011,

'是'),

'') as sflj,

--太长了,省略大部分select子句

fromlcr l

left join lcrrm on rm.requisition_id =

l.master_bill_id

andrm.table_type = '0'

andnvl(rm.bsflag, 0) != 1

left join cos sub on l.org_id = sub.org_id

andnvl(sub.bsflag, 0) != 1

left join coioi on oi.org_id = sub.org_id

andnvl(oi.bsflag, 0) != 1

--太长了,省略大部分jion

wherel.table_type = '1'

andl.requisition_state = '0101020304'

andnvl(l.bsflag, 0) != 1

andto_char(l.back_date, 'yyyy-MM-dd') between '2012-01-01' and

'2012-04-25'

group by l.requisition_id,

l.note,

l.requisition_type,

sub.org_subjection_id,

syb.org_abbreviation,

rm.rec_notice_org_id,

oi.org_abbreviation,

--太长了,省略大部分group by 字段

) a--主查询a

LEFT JOIN crviewve--视图ve

ON ve.requisition_id = a.req_id

这个sql里关联的表很多,嵌套多层子查询,最后又与一个视图进行关联(视图也很复杂)。该报表查询4个月的数据,计算时间为6分42秒,太慢了远远达不到用户要求。

我们对这个报表做过几次优化,但sql复杂度较高,基本没有优化空间,而且由于是实时查询,所以无法采用事先计算建立中间表的方法。后对这个报表进行监控发现,数据集SQL执行需要5分钟,计算展现需要1分多钟,数据集SQL慢的原因是其中两个子查询(主查询a和视图ve)做join的效率极低。

所以优化思路定为——优化数据集取数,改善SQL的join效率低的情况,顺便优化报表计算展现。

解决过程

我们是用集算器(报表厂家的东西)解决这个问题:

1、拆分原报表数据集SQL

分别把两个子查询sql写到集算器,并用switch完成关联(Switch是它的函数,比较新颖,能将外键指向的记录直接当成本记录的属性,也支持join,视不同情况使用)。

2、消除报表格间运算

将原报表模板中的比值和汇总值这些全部移到集算器中做,少了单元格遍历,报表计算速度也能提高。

3、将结果集一次返回给报表

完成所有数据准备后,把计算结果一次性返回给报表工具,报表接收到数据源后直接进行展现(不再做其他如格间计算类的影响效率的计算)。

总体代码如下:

解决效果

该报表展现时间从原来的6分42秒锐降到57秒,优化效果非常明显,超出了用户预期。其他有类似问题的报表也准备采用这个思路。

问题小结

主查询a和视图ve分别在Oracle跑时只需要10到40秒,但二者做jion却需要好几分钟,原因在于Oracle在完全自动制定查询计划的时候,并不是每次都能找到合理的方法(人工干预比较费劲)。集算器能提升性能是因为ve是a的维表,可以用特别的switch方法。由人来决定复杂查询的路径,结合Oracle的基础查询语句,速度就显著提升了。

转载于:https://blog.51cto.com/report5/1339206

oracle数据源的报表sql计算慢解决相关推荐

  1. oracle求累积收益率,解决报表sql中的累计收益率问题?换个姿势,再来一次~

    原标题:解决报表sql中的累计收益率问题?换个姿势,再来一次~ 最近在做券商资产分析业务的时候,碰到个报表需求,要求计算从20170301到20170831期间,大约40w客户(表数据量5000w)的 ...

  2. log4jdbc oracle,通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql

    通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql 通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql 说一下配置: 服务器weblogic ...

  3. oracle 求一年多少天,SQL 计算一年有多少天

    SQL 计算一年有多少天,计算当前年份有多少天. SQL 计算一年有多少天 问题描述 计算当前年份有多少天. SQL 计算一年有多少天 解决方案 计算当前年份有多少天,等同于计算下一年的第一天和当前年 ...

  4. 使用SQL 计算一组数据的峰度、偏度 公式依据excel的KURT函数和SKEW函数 Oracle 数据库

    使用SQL 计算一组数据的峰度.偏度 公式依据excel的KURT函数和SKEW函数 因为工作原因,要把excel的KURT和SKEW函数在Oracle实现出来并统计,在网上找了半天没有答案..只能自 ...

  5. 安利一款报表工具,Smartbi解决了Excel做报表的痛点

    Smartbi报表工具:https://www.smartbi.com.cn/download 众所周知,Excel是一个电子表格工具,而非数据库程序,通常用于制作报表.而一个数据库程序在数据存储和数 ...

  6. oracle 水晶报表开发,水晶报表连接Oracle做数据报表笔记

    首先,新建一个水晶报表的文件,这个时候要给这个报表文件绑定一个oracle数据源, 选择右侧菜单的这个东西,选择"数据库专家",打开之后是这么一个界面: 选择建立新连接: 这个地方 ...

  7. 润乾报表实现计算过程性能优化

    当报表出现性能问题,需要对数据源计算进行优化时,控制执行路径是一种有效的方法,但也是阻碍优化的难题.这是由于数据库执行路径不透明,程序员很难甚至无法干预执行路径,进而也就难以提高数据库访问的性能.而对 ...

  8. oracle笔记一(sql语句方面)

    oracle笔记一(sql语句方面) 一.sql语句 --================================================ 1.增加主键    alter table ...

  9. 部分常见ORACLE面试题以及SQL注意事项

    一.表的创建: 一个通过单列外键联系起父表和子表的简单例子如下: CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id) ) CREATE TABL ...

最新文章

  1. caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片
  2. 1、MyEclipse插件配置以及通过MyEclipse生成表对应的JPA代码
  3. python接口自动化接口依赖_Python接口自动化之mock模块简单使用
  4. (1) nginx的安装
  5. 移动后端支持平台Parse将API由Ruby迁移到Go
  6. kafka in action
  7. 万稞pw80线切割编程软件_Sodick 沙迪克慢走丝线切割机床,工件摆斜不校边加工步骤...
  8. 数据挖掘概念与技术(原书第三版)范明 孟小峰译-----第二章课后习题答案
  9. Unity | 部分区域自由截图
  10. 30 行代码实现,支付宝蚂蚁森林自动收能量!
  11. 【JavaSE】列车售票系统数据库(表的源代码)
  12. 酷比魔方 iwork10旗舰版恢复出厂设置遇到的问题
  13. I DEA出现Spring配置错误:class path resource [.xml] cannot be opened because it does not exist
  14. Facebook Marketing: Advanced Advertising Facebook营销:高级广告 Lynda课程中文字幕
  15. android 开源 高斯模糊_Android高斯模糊、高斯平滑(Gaussian Blur)【1】
  16. Unirech-阿里云国际版云服务器ecs实例使用中的常见问题汇总
  17. 2021华为软件精英挑战赛(杭厦第20名)
  18. 《动手学深度学习》—学习笔记
  19. 免费电话会议的盈利模式
  20. 完整JavaWeb项目笔记 第九部分-Bootstrap模板设计

热门文章

  1. homebrew常用指令
  2. Android 开源库获取途径整理
  3. angular http demo
  4. 【IBM Tivoli Identity Manager 学习文档】11 TIM设计思路介绍
  5. linux下基本命令
  6. 蜘蛛,爬虫多,代码质量差下的相对供求平衡策略
  7. 美容院会籍管理,看着简单,其实很复杂
  8. Windows azure 上将Legcay IO操作轻松切换到Blob
  9. abap 常用系统变量
  10. guestbook.php注入,TinyGuestBook 'sign.php'多个SQL注入漏洞