大量数据查询与导出的技巧性探索

朱鸿正 发布于 2010/12/10 13:04
阅读 419
收藏 1

我们有个运维系统,开发维护了6年了,业务系统数据只会越来越多。至今,已有不少业务表达到百万级,千万级也有一些。

查询与导出效率差一直是我们的头号难题,用户要查询数据,并希望尽可能展示更多的字段,必须关联多个表,然后月底月初用户要对前月数据进行导出,我们的后台原来并没有排队机制,都是收到一个导出请求就对数据库进行查询,然后导出为文件供用户下载(非常糟糕的设计),因此,经常在这段时间系统白屏。关于这个查询和导出,不知大家有没有比较秒的解决办法。

至于数据表优化方面,基本没法再优化了,用的是oracle10G,分区索引、hint什么的、都有一些应用,新炬的也有帮忙做过优化,所以我任务,从sql和数据库表结构方面的优化空间不大,应该从操作和逻辑上进行优化。

查询的解决办法我倒想不出,但是导出的办法我倒是想到一个点子,如:

采用高并发的服务端应用,除了加入排队机制,对要导出的数据进行分块查询,不需要一次查询所有数据,这样就可以一边生成文件同时一边发送给客户端进行下载,这样可以有效利用网络的阻塞来缓解服务器压力,当服务器压力高时,可以自动调节任务的执行效率(如查询频率或“块”变小),在用户看来,就是下载变慢了,而且把用户不良好的感觉嫁祸给网络(yin荡啊!)。

希望各位高手分享下意见和看法,帮助小弟我开阔开阔思路,学习学习知识。谢谢。。

 

加载中
0
抢小孩糖吃
抢小孩糖吃

利用视图来完成应用的一些功能会大大减少查询速度,视图是可以扩展的,操作跟表类型

0
路阳
路阳

难道只有视图么?

0
朱鸿正

引用来自#2楼“haishenshizi”的帖子

利用视图来完成应用的一些功能会大大减少查询速度,视图是可以扩展的,操作跟表类型

有用到视图的,这样的查询不可能不用到吧。但是视图也是要多个表链接,查询的数据量一样的大。

0
路阳
路阳

那到底有什么好办法呢?

0
ddatsh
ddatsh

感觉LZ的需求是大数据量的导出

 

我之前做的系统 搞的就是这个

保险公司,大数据量导出

前台有两个按钮,一个是导出当前页,另一个是任务调度按钮,点了生成个任务号,前台传入最终 SQL语句中WHERE语句

中的 条件参数名和值

后台轮循程序去表中取待执行任务

根据配置的SQL 去执行,写入到xls文件,XLS用的是二进制流格式写成BIFF格式

65000行换一个XLS文件,最终打包成ZIP 供下载

后来小扩展了一下,一个任务可执行多个SQL语句

真的很大量的数据,5,6W 的,前台导出就不靠谱的

 

PS: 觉得你搞什么 块啊这种概念,不靠谱,你去实现啊?

以前我们也曾设想搞什么任务优先级 权重的

后来不了了之了

本质是没有奖金,没有技术支持,就我一人,还有就是个人对公司的不满了

0
朱鸿正

to dd:

谢谢。定制任务我们都有考虑过,但是如何任务很久之后才执行,那如何通知客户?客户端页面可能早已过期。不过可以用进度条之类的让用户停留在页面等待,但是不知道客户的体验会不会好些。于是想要探索多些方案,综合考虑。

另外我对帖子中的方法做了下简单的测试,边下载边导出的方式的话,是可行的,但是如果导出的记录超过了单个sheet最高记录数(2003是6w多),我就只能分成两个csv文件,这就麻烦大了,如果是xls的话起码可以分2个sheet,但是csv不行,还有个不太另我满意的地方就是,客户端下载时,无法知道整个文件有多大,也就无法显示进度条,因为无人知道数据有多大。看来这方案遇到的棘手问题不少。

 

返回顶部
顶部