最近在某软件公司实习,成功帮助公司大大减少了下载海量历史数据的时间。其实非常简单,闲来和大家分享一下:
A公司是一家跨国企业,其开发了一款软件,用于在仓库打印物流包装盒上的标签,并且将每次打印操作记录在了关系数据库中。为了方便历史数据的分析,每月底仓库工作人员需要导出该仓库的月度历史打印数据到Excel中,大约有2万条,在目前的Server性能和软件代码的效率下,平均耗时10分钟。
是否存在缩短下载时间的解决方案?抱着试一试的态度,我找到了控制下载数据的sql command,
StringBuilder sql = new StringBuilder("select a.*, d.customer_name,e.address_code, …
初看之下,我也没有发现这有什么问题,就是把a中的所有数据,和d,e中的部分数据提取出来。在分析了实际导出Excel的所需数据后,发现...
所以,a中只有57/107的数据是需要被用到的,其余纯属浪费资源和下载时间,只需指定a中需要的数据即可:
StringBuilder sql = new StringBuilder("select a.force_print,a.pps_number,a.pps_line,a.pn,a.description,a.cpn,a.print_label_qty,a.print_label_qty_ex,a.print_ship_qty,a.print_box_qty,a.print_relabel_qty,a.user_print_time,a.print_qty,a.lot,a.dc,a.brand,a.coo,a.attribute1,a.attribute2,a.attribute3,a.attribute4,a.attribute5,a.serial,a.action,a.ctn,a.net_weight,a.gross_weight,a.dimension,a.mpq,a.cap_original,a.cap,a.zsize,a.tol,a.volt,a.dielectric,a.po_item,a.mat_sales_txt,a.vendor_lot,a.box_id,a.primax_box_id,a.batch_number,a.delivery_text,a.delivery_date,a.print_date,a.plant_code,a.company_code,a.apn,a.Handling_Item,a.Handling_UnitItem,a.mat_desc,a.basic_txt,a.mfg,a.format_id,a.format_file_id,a.labelType_id,a.printNum,a.brand_ext,"
+ " d.customer_name,e.address_code, …
修改运行后,万万没想到,只需要5分钟甚至更少的时间就可以完成任务!而在这之前,这个软件已经运行3年之久,小小的改变,极大优化了工作人员的等待时间(真是心疼仓库的叔叔阿姨!)反思一下,大公司可能也有没有考虑完善的地方,也有可能这种非核心业务并没有得到应有的重视。
P.S. 虽然下载时间得到了改善,但是从使用者体验出发,他需要能够随时可以关闭这个非常占用时间的任务,如果可以的话,最好能够看到下载进程。然后,我就自己挖了个坑。。。请听下回分解:《C#多线程应用——让海量数据的下载任务可控》