问题描述
我来介绍下此报表需要的功能然后我现在的实现下面这张就是报表的样子每一个单元格都是统计的人数有多少个。而且那个数字是可以钻取的点开后可以显示具体是哪些人的基本信息。其实现在的每一张表都是每一个有数据的单元格都是一条SQL语句有简单有复杂的。下面就是表的结构。大家可以看到有表名。有个坐标5-4之类的意思是对应到该表第5行第4列的坐标。这样就区分了每张表的每个单元格的唯一性。后面的bianma就是储存改单元格的SQL语句。后面那个数字刚开始表是没有的是根据计算每个单元格的SQL语句而算出来的个数然后批量更新进去的。现在说下我代码的思路我前台是通过异步来进行计算的成功的话就返回计算成功提示。现在是前台传过来好多表的表名然后我通过表名查询出所有表下面的单元格拿出里面的SQL然后循环执行查询里面的SQL获取查询单元格SQL的结果。然后把结果批量更新到表中统计数量的COUNTBIANMA的字段里面去。[img=http://img.bbs.csdn.net/upload/201410/28/1414468131_403761.jpg][/img]问题来了如果全选表一次性计算要将近半个小时非常慢。大家可以来讨论和设计从表的设计和程序的设计都可以为楼楼提供些想法和建议。可以有新技术。因为要设计到钻取功能目前想到的就是这个表设计。因为前台点击数字我传到后台的是该表名和坐标然后就可以拿到该单元格的SQL从而查询出来。
解决方案
解决方案二:
解决方案三:
补上最后一张图片
解决方案四:
目前发现貌似逐个执行单元格里面的查询SQL也比较费时。
解决方案五:
查询优化做一个查询统计表,把第一次查询每一条需要消耗多长时间做一个时间标记;第二次查询的时候使用线程来做,把指定耗时范围内的查询通过线程进行分配。记住线程池的大小分配!更新也可以参考上述方式。程序运行的时候可以采用Profile来监控你的应用情况!然后设置相应的线程池与数据源大小达到最优的情况为止!