优化SQL执行路径提高报表性能

报表出现性能问题需要对数据源计算进行优化时,执行路径难以确定从而被干预是阻碍报表优化的难题之一。由于数据库执行路径对开发人员不透明,报表优化需要指定执行路径时,程序员会很难甚至无法干预。而一般报表工具不具备强计算能力,大部分计算仍然要依靠数据库进行,这就导致很多报表优化效果不理想。

不同于一般报表工具,润乾集算报表内置了专门用于数据计算的集算引擎,开发人员可以通过编写集算脚本完成报表数据源准备。与数据库执行SQL路径不可控相比,集算脚本的执行过程是可控的,开发人员可根据实际情况编写或更改计算执行过程,完成报表优化工作。

集算引擎中内置了丰富的用于结构化数据计算的类库,如连接操作在集算引擎中就包括普通连接的join()、按序号对应连接的pjoin()、叉乘连接的xjoin(),针对维表和事实表连接提供了更加高效的连接方式switch(),这样就为开发人员在优化报表时提供了多种选择。此外,由于集算报表支持分步编写,开发人员可以自由决定计算顺序,先算什么后算什么,甚至对一个复杂计算进行合理拆分和整合,适合需要改变计算顺序来进行优化的场景。

下面是一个针对报表数据源SQL优化的实例过程和效果,用户在使用集算报表时可以参考。

该报表是一张明细表,数据量较大,涉及到的数据库表有几十个之多,数据库表间关联频繁(包括自连接的情况);报表中包含多个格间计算表达式(比值和汇总值)。

其中较复杂的数据集SQL(近400行)如下:

select t.*

from (select *

from (select syb.org_abbreviation as syb,

max(xmb.org_abbreviation) as xmb,

--省略多个连接、判断、汇总语句

left join losrrr losr onlosr.requisition_id =

l.requisition_id

where l.table_type = ‘1‘

and l.requisition_state =‘0100500005000000006‘

and nvl(l.bsflag, 0) != 1

group by l.requisition_id,

l.note,

--省略多个分组字段

losr.standby_param3,

losr.standby_param6

) a

LEFT JOIN crview ve  --视图

ON ve.requisition_id = a.req_id

仔细看这个sql会发现,首先关联的表比较多,其中包括很多自关联的情况;嵌套了很多子查询;最后又与一个视图进行关联(视图复杂程度与上述SQL类似)。该报表查询4个月数据展现时间6分42秒,远远达不到用户要求。由于SQL比较复杂,数据库执行路径难以控制,所以很难在SQL的层面再进行优化。

使用集算报表进行优化的过程如下:

1、编写集算脚本

首先,拆分原报表数据集SQL。这个SQL慢的原因在于两个子查询之间的join,那么分别把两个子查询sql写到集算脚本中执行,并且在集算脚本中使用switch完成关联。

其次,消除报表格间运算。将原报表模板中的格间计算(比值和汇总值)的内容全部移到集算脚本中完成,这样报表少了格子遍历的过程,可以提升性能。

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

完整的集算脚本如下:

2、在集算报表中调用上述集算脚本,编辑报表表达式完成报表制作。

优化效果

         报表展现要经历的两步:1数据源计算(执行数据集SQL)阶段,2 报表计算并展现阶段,报表优化前后各阶段与总时间对比见下表:

通过上面的过程,该报表展现时间从原来的6分42秒,锐降到了57秒,不到1分钟的时间,达到了用户预期的目标。

使用集算报表进行报表优化适用于从数据库取出数据量不是很大的场景(由于Oracle JDBC速度非常慢),通过使用这种可控的过程优化手段迅速提升报表性能。

时间: 2024-11-10 02:13:36

优化SQL执行路径提高报表性能的相关文章

OutputCache缓存优化asp.net代码 提高网页性能

对于asp.net编写的网页来说,使用缓存是一种非常重要也是很常用的优化技术,它可以大大减轻服务器的负载压力,优化这些网页的性能,在网与使用 .NET Framework 的任何其他功能相比,适当地使用缓存可以更好地提高站点的性能.同时,在网页加速显示上也起了很大的作用. OutputCache以声明的方式控制 ASP.NET 页或页中包含的用户控件的输出缓存策略. 语法: <%@ OutputCache Duration="#ofseconds"   Location=&quo

SQL执行过程中的性能负载点

一.SQL执行过程 1.用户连接数据库,执行SQL语句: 2.先在内存进行内存读,找到了所需数据就直接交给用户工作空间: 3.内存读失败,也就说在内存中没找到支持SQL所需数据,就进行物理读,也就是到磁盘中查找: 4.找到的数据放到内存中,在内存进行数据过滤再放到会话工作空间. 5.假设会话工作空间需要暂存结果集进行排序,但空间不足的话,就会借用磁盘tmpdir,最后再将结果返回给用户. 注: 用户会话空间是内存中分配出来的一个工作空间,而innodb_buffer_pool是innodb存储引

Oracle 提高查询性能(基础)

#1,选择最有效的表名顺序 Oracle解析器总是按照从右至左的顺序处理FROM后面的表,因此FROM最右边的表将会被当做驱动表优先处理,当存在多个表关联时,应当使用记录少的表当做驱动表.如果关联的表多的话,则用交叉表作为驱动表. #2,select中避免使用'*'. #3,  减少数据库访问的次数 每当执行一条SQL语句,Oracle 需要完成大量的内部操作,象解析SQL语句,估算索引的利用率,绑定变量, 读数据块等等.由此可 见,减少访问数据库的次数,实际上是降低了数据库系统开销 #4, 用

SQL Server SQL性能优化之--通过拆分SQL提高执行效率,以及性能高低背后的原因

复杂SQL拆分优化 拆分SQL是性能优化一种非常有效的方法之一, 具体就是将复杂的SQL按照一定的逻辑逐步分解成简单的SQL,借助临时表,最后执行一个等价的逻辑,已达到高效执行的目的 一直想写一遍通过拆分SQL来优化的博文,最近刚好遇到一个实际案例,比较有代表性,现分享出来, 我们来通过一个案例来分析,为什么拆分语句可以提高SQL执行效率,更重要的是弄清楚,拆分前为什么慢,拆分后为什么快了? 幼稚的话,各位看官莫笑 先看一下相关表的数据量,大表也有5900多万,小表有160多万 (声明:我从来没

报表性能优化方案之行引擎执行层式报表

1. 问题描述 这样一种报表:报表形式非常简单,只是简单的单数据源明细报表,但是数据量非常大,百万.千万甚至更多.报表取数及计算时间相当长. 希望能够提高报表展示速度,对于用户来说,查询报表不会有滞后的感觉. 解决方案提供工具:报表开发工具FineReport. 2. 解决方案 2.1 解决方案 对于单数据源明细报表,可以启用行引擎来执行报表,提高报表展示速度,优化用户体验. 2.2 原理 普通报表:取出全部数据后再执行报表,最后返回整体的报表结果给浏览器,用户访问到看到结果的时间=报表取数时间

mysql优化之sql执行流程及表结构(schema)对性能的影响

part 1 sql执行流程(如下图所示) 1.客户端发送一条查询到服务器. 2.服务器通过权限检查后,先检查查询缓存,命中则直接返回结果.否则进入3. 3.服务器进行sql解析,预处理,再由优化器根据该sql涉及到的数据表的信息计算,生成执行计划. 4..MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询:5..将结果返回给客户端. 总结:SQL执行的最大瓶颈在于磁盘的IO,即数据的读取:不同SQL的写法,会造成不同的执行计划的执行,而不同的执行计划在IO的上面临完全不一样的数

PHP 提高PHP性能的编码技巧以及性能优化

0.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这 么做,它是 一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号). 1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row[’id’] 的速度是$row[id]的7倍. 3.echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而

报表性能优化方案之报表取数

1. 取数原理 设计器拼出最终的SQL,将SQL语句传给数据库,数据库执行,将数据返回给设计器. 由于计算过程首先要通过SQL语句从数据库中取数据,我们可以通过控制数据量的大小和对数据的提前预处理来提高报表的性能.下面是一些优化的方法. 2. 优化SQL FineReport报表的数据集采用的是表模型,也就是说通过SQL这种DSL语言,从数据库通过简单查询或各种组合关联查询得到一个关系表,而这部分SQL查询根据各种数据库产商长时间的优化(比如建立索引),已经非常成熟.数据集一般要通过FineRe

Oracle性能优化之执行计划管理_超越OCP精通Oracle视频教程培训31

Oracle性能优化之执行计划管理_超越OCP精通Oracle视频教程培训31 本课程介绍: Oracle视频教程,风哥本套oracle教程培训<<Oracle数据库性能优化培训教程>>的第1/10套:Oracle性能优化之执行计划管理.主要学习Oracle性能优化简介,SQL 语句处理流程,软解析和硬解析,绑定变量及案例,游标的介绍,Oracle的优化器,执行计划的查看,SQL语句访问路径,SQL语句的连接方式,Oracle驱动表,执行计划的干预,常用hint提示的使用. 视频教