代码改变世界

统计报表优化中用到的处理DataTable的方法(通过此方法模仿左连接效果)

  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的方法(通过此方法模仿左连接效果)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示