统计报表优化中用到的处理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的方法(通过此方法模仿左连接效果)
原文地址:https://www.cnblogs.com/stubman/p/1567114.html