统计报表优化中用到的处理DataTable的方法(通过此方法模仿左连接效果)
2009-09-15 16:30 stubman 阅读(1068) 评论(0) 编辑 收藏 举报这半年一直再做一个大项目的报表的开发与维护。(数据库: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的方法(通过此方法模仿左连接效果)
这个项目中,报表一般都是统计各个机构指定项目的数据,以下给一个范例:
一般的实现,后台一条SQL语句,以机构(organ)为基准,每个项目都用【select organ,count(*) from table group by organ】的写法构造出虚拟表,然后虚拟表通过organ左连接,为空的赋0。
得出的SQL语句一般是这样(假设有两个项目要统计):

简单的报表,利用这种格式得出的DataTable提交给前台,前台统一实现(得出同一风格的HTML表现),这样,开发报表的工作就简化到大部分进行后台SQL语句的编写上,极大的提高了开发效率。
然而,项目中有的报表,统计项目繁多,甚至有的总共50多个项目数据,也就是50多列,若还是这样写,SQL语句会非常长,传给数据库执行,Oracle将花很大的时间空间对SQL语句进行解析,这是十分消耗数据库服务器CPU的,直接导致系统性能受到影响。
想办法进行优化,由于控制呈现的前台处理比较复杂,希望依然返回相同的DataTable,这样不需要修改前台程序。
最后,想到了将每个统计项目分开查询,得出各个项目的数据(装入DataTable中),然后根据机构,拼接起来,在C#中实现左连接。以下就是对各个子DataTable进行左连接的处理方法。通过往TargetTable中加入不同的JoinTable的不同列,构造出要返回的TargetTable。
这样一条由几十个虚拟表连接构造出来的SQL语句可以分成几十个单独的SQL语句分别执行,然后再用以下方法进行处理,得到左连接的效果。
实现后进行测试,这种处理速度上有小幅度提高,很关键的是,执行查询的时候服务器负载得到了降低。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?