zoukankan      html  css  js  c++  java
  • 统计报表优化中用到的处理DataTable的方法(通过此方法模仿左连接效果)

    这半年一直再做一个大项目的报表的开发与维护。(数据库:Oracle)
    这个项目中,报表一般都是统计各个机构指定项目的数据,以下给一个范例:

    一般的实现,后台一条SQL语句,以机构(organ)为基准,每个项目都用【select organ,count(*) from table group by organ】的写法构造出虚拟表,然后虚拟表通过organ左连接,为空的赋0。

    得出的SQL语句一般是这样(假设有两个项目要统计):
    SQL

    简单的报表,利用这种格式得出的DataTable提交给前台,前台统一实现(得出同一风格的HTML表现),这样,开发报表的工作就简化到大部分进行后台SQL语句的编写上,极大的提高了开发效率。
    然而,项目中有的报表,统计项目繁多,甚至有的总共50多个项目数据,也就是50多列,若还是这样写,SQL语句会非常长,传给数据库执行,Oracle将花很大的时间空间对SQL语句进行解析,这是十分消耗数据库服务器CPU的,直接导致系统性能受到影响。

    想办法进行优化,由于控制呈现的前台处理比较复杂,希望依然返回相同的DataTable,这样不需要修改前台程序。
    最后,想到了将每个统计项目分开查询,得出各个项目的数据(装入DataTable中),然后根据机构,拼接起来,在C#中实现左连接。以下就是对各个子DataTable进行左连接的处理方法。通过往TargetTable中加入不同的JoinTable的不同列,构造出要返回的TargetTable。
    这样一条由几十个虚拟表连接构造出来的SQL语句可以分成几十个单独的SQL语句分别执行,然后再用以下方法进行处理,得到左连接的效果。
    实现后进行测试,这种处理速度上有小幅度提高,很关键的是,执行查询的时候服务器负载得到了降低。

    处理DataTable的方法(通过此方法模仿左连接效果)
  • 相关阅读:
    hdu 携程全球数据中心建设 (球面距离 + 最小生成树)
    next_permutation()函数 和 prev_permutation() 按字典序求全排列
    poj 3792 Area of Polycubes (简单模拟)
    poj 3790 Recursively Palindromic Partitions (递推)
    hdu 1575 Tr A (矩阵快速幂入门题)
    hdu 2986 Ballot evaluation (模拟)
    sscanf() 和 sprintf()的用法。
    Codeforces Round #239 (Div. 2)
    hdu 2372 El Dorado (dp)
    hdu 3433 A Task Process(dp+二分)
  • 原文地址:https://www.cnblogs.com/stubman/p/1567114.html
Copyright © 2011-2022 走看看