`
datamachine
  • 浏览: 161842 次
社区版块
存档分类
最新评论

oracle数据源的报表sql计算慢&解决

阅读更多

问题描述

项目里有些报表出来的速度特别慢,尽管对润乾报表和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的基础查询语句,速度就显著提升了。

 

  • 大小: 86.6 KB
0
0
分享到:
评论

相关推荐

    oracle数据源

    在实际应用中,Oracle数据源常用于报表工具、BI系统、ERP软件等,它们通过ODBC接口与Oracle数据库交互,实现数据提取、转换和加载(ETL)任务,或者进行实时的数据查询和分析。 总的来说,"oracle_data_source"这个...

    jimu_report-oracle.zip

    1. 数据源连接:积木报表支持Oracle数据库作为数据源,用户需要配置相关的数据库连接信息,包括数据库服务器地址、端口号、数据库服务名、用户名和密码等,以便报表系统能够从Oracle数据库中获取数据。 2. SQL查询...

    Oracle数据仓库解决方案

    Oracle数据仓库解决方案是一种高效、可扩展的架构,用于存储、管理和分析大量的企业级数据。它为企业提供了一种集中管理信息的方式,以便进行深入的数据分析、报告和决策支持。Oracle的数据仓库设计旨在优化查询性能...

    Crystal报表数据源和数据访问模式

    水晶报表支持多种数据源,包括关系数据库(如SQL Server、Oracle、MySQL等)、多维数据集(如OLAP立方体)、XML文件、Web服务、Excel电子表格以及.NET对象等。在.NET环境中,可以通过Visual Studio的水晶报表设计器...

    OracleEBS-报表开发工具

    - **JOIN 使用**: 学习如何通过 JOIN 功能整合不同数据源,以实现更全面的数据分析。 - **上钻/下钻**: 支持用户根据需要深入查看数据细节或概括查看整体情况。 - **分类汇总**: 实现基于特定分类的汇总计算,例如按...

    如何在水晶报表中实现SQL 查询源程序实例,C#.net源代码编写

    报表的数据源可以是各种数据库,如SQL Server、Oracle、MySQL等,也可以是XML文件或自定义数据源。SQL查询在此过程中起到关键作用,它负责从数据库中获取所需数据。 实现步骤如下: 1. **创建水晶报表项目**:在...

    BIRT数据源设置和动态Sql

    ### BIRT数据源设置与动态SQL详解 ...通过以上两个方面的介绍,我们可以看出BIRT不仅提供了强大的报表设计功能,还支持高级的数据源管理和动态SQL生成能力,这对于复杂报表应用场景来说是非常有用的。

    SQLServer图形化报表生成工具

    SQL Server报表服务(SQL Server Reporting Services,简称SSRS)是Microsoft提供的一款强大的报表解决方案,它允许用户生成各种类型的报表,包括表格、图表、地图等,并能与多种数据源集成。 二、图形化界面的优势...

    SQLTracker监视使用Oracle数据库的应用程序

    2. **SQL分析**:它能够对SQL语句进行深度分析,如解析执行计划、显示行源、计算成本,以及比较不同执行计划的性能差异。 3. **资源消耗**:SQLTracker可以追踪SQL语句对数据库资源的占用情况,如内存、CPU和磁盘I/...

    SQL Server 2005报表服务入门

    总的来说,SQL Server 2005报表服务是企业级报表解决方案的重要组成部分,它提供了丰富的报表设计工具、灵活的数据源支持、安全的分发机制以及强大的数据分析能力,是构建高效数据驱动决策环境的基础。通过学习这个...

    oracle ebs 报表输出

    该工具允许用户通过图形化界面设计复杂的SQL查询,生成报表布局,并可以与EBS模块的数据源进行集成。报表可以是基于数据库查询的静态报表,也可以是动态的,根据用户输入的参数进行实时生成。 在博文链接中提到的...

    用友NC65报表创建步骤-实用

    在NC65中,创建内部报表的过程涉及到多个步骤,包括数据源配置、语义模型构建、报表设计以及权限分配。下面我们将详细探讨这些关键环节。 首先,**数据源的配置**是报表创建的基础。在动态建模平台中,通过系统管理...

    oracle数据仓库解决方案

    ### Oracle数据仓库解决方案 #### 一、数据仓库发展的商业驱动力 ##### 1.1 企业生存环境的变化 在信息时代背景下,随着互联网技术的飞速发展,全球各地的企业正面临着前所未有的变革。互联网不仅为企业提供了...

    sqlserver 报表模板

    在SQL Server中,数据源可以是SQL Server数据库、Oracle、Excel、XML文件等。数据集是查询数据源并返回结果的逻辑单位,用户可以在报表设计时定义或预定义数据集。 4. **表达式与参数**: SSRS支持使用表达式来动态...

    SQL Server 2008报表服务入门到精通

    SQL Server 2008报表服务(Report Services)是SQL Server的一个组件,它提供了企业级的报表解决方案,能够生成交互式、可打印的报表,支持多种数据源,并允许用户自定义报表展现样式和格式。报表服务不仅支持Web...

    oracle 数据仓库解决方案

    1.4 ORACLE数据仓库:被证明是有实力的商务解决方案 6 二、ORACLE数据仓库的体系结构 7 2.1 数据仓库的平台:数据库和决策分析工具 11 2.1.1 Oracle8i的数据仓库新特性 11 2.1.2 Oracle OLAP产品的新发展 13 2.1.3 ...

    SQL_Server报表服务

    它与SQL Server数据库引擎紧密集成,为用户提供了一个全面的报表解决方案,支持从多种数据源获取数据,并将这些数据以可视化的方式呈现出来。 SSRS的主要特点和功能包括: 1. **报表设计**:用户可以使用报表设计...

    VB.net 水晶报表 动态数据源

    它提供了直观的界面来设计报告,支持多种数据源,如SQL Server、Oracle、Access等,并可以导出为PDF、Excel等多种格式。 2. **VB.NET集成水晶报表** 在VB.NET项目中,可以通过Visual Studio的水晶报表设计视图来...

Global site tag (gtag.js) - Google Analytics