oracle数据源的报表sql计算慢解决
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计算慢解决相关推荐
- oracle求累积收益率,解决报表sql中的累计收益率问题?换个姿势,再来一次~
原标题:解决报表sql中的累计收益率问题?换个姿势,再来一次~ 最近在做券商资产分析业务的时候,碰到个报表需求,要求计算从20170301到20170831期间,大约40w客户(表数据量5000w)的 ...
- log4jdbc oracle,通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql
通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql 通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql 说一下配置: 服务器weblogic ...
- oracle 求一年多少天,SQL 计算一年有多少天
SQL 计算一年有多少天,计算当前年份有多少天. SQL 计算一年有多少天 问题描述 计算当前年份有多少天. SQL 计算一年有多少天 解决方案 计算当前年份有多少天,等同于计算下一年的第一天和当前年 ...
- 使用SQL 计算一组数据的峰度、偏度 公式依据excel的KURT函数和SKEW函数 Oracle 数据库
使用SQL 计算一组数据的峰度.偏度 公式依据excel的KURT函数和SKEW函数 因为工作原因,要把excel的KURT和SKEW函数在Oracle实现出来并统计,在网上找了半天没有答案..只能自 ...
- 安利一款报表工具,Smartbi解决了Excel做报表的痛点
Smartbi报表工具:https://www.smartbi.com.cn/download 众所周知,Excel是一个电子表格工具,而非数据库程序,通常用于制作报表.而一个数据库程序在数据存储和数 ...
- oracle 水晶报表开发,水晶报表连接Oracle做数据报表笔记
首先,新建一个水晶报表的文件,这个时候要给这个报表文件绑定一个oracle数据源, 选择右侧菜单的这个东西,选择"数据库专家",打开之后是这么一个界面: 选择建立新连接: 这个地方 ...
- 润乾报表实现计算过程性能优化
当报表出现性能问题,需要对数据源计算进行优化时,控制执行路径是一种有效的方法,但也是阻碍优化的难题.这是由于数据库执行路径不透明,程序员很难甚至无法干预执行路径,进而也就难以提高数据库访问的性能.而对 ...
- oracle笔记一(sql语句方面)
oracle笔记一(sql语句方面) 一.sql语句 --================================================ 1.增加主键 alter table ...
- 部分常见ORACLE面试题以及SQL注意事项
一.表的创建: 一个通过单列外键联系起父表和子表的简单例子如下: CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id) ) CREATE TABL ...
最新文章
- caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片
- 1、MyEclipse插件配置以及通过MyEclipse生成表对应的JPA代码
- python接口自动化接口依赖_Python接口自动化之mock模块简单使用
- (1) nginx的安装
- 移动后端支持平台Parse将API由Ruby迁移到Go
- kafka in action
- 万稞pw80线切割编程软件_Sodick 沙迪克慢走丝线切割机床,工件摆斜不校边加工步骤...
- 数据挖掘概念与技术(原书第三版)范明 孟小峰译-----第二章课后习题答案
- Unity | 部分区域自由截图
- 30 行代码实现,支付宝蚂蚁森林自动收能量!
- 【JavaSE】列车售票系统数据库(表的源代码)
- 酷比魔方 iwork10旗舰版恢复出厂设置遇到的问题
- I DEA出现Spring配置错误:class path resource [.xml] cannot be opened because it does not exist
- Facebook Marketing: Advanced Advertising Facebook营销:高级广告 Lynda课程中文字幕
- android 开源 高斯模糊_Android高斯模糊、高斯平滑(Gaussian Blur)【1】
- Unirech-阿里云国际版云服务器ecs实例使用中的常见问题汇总
- 2021华为软件精英挑战赛(杭厦第20名)
- 《动手学深度学习》—学习笔记
- 免费电话会议的盈利模式
- 完整JavaWeb项目笔记 第九部分-Bootstrap模板设计