首页 新闻 会员 周边

一个具体业务场景的统计问题,求老司机带路

0
悬赏园豆:40 [已解决问题] 解决于 2016-10-19 12:36

  说个场景:一个物料进场,我们有个物料单。然后有对这个物料管理,比如加工、质检、评分、针对物料提出的问题等等(这些操作都是并行的,也就是说不分先后,而且每个操作都会有多次)。  

  那我现在要显示以一个物料单为主信息的统计,其中我要统计我对物料的最近操作时间,也就是我上面说的那些操作中最近做的操作。  显而易见的方法就是每张表求max(updatetime) 然后把所有表放在一起求最大值。但是这些操作表有5、6张 这样处理就要关联很多张表,当单表数量增长上来势必要影响速度。

  然后我又想到要不要在物料表中增加一个最近时间字段,然后再对每个操作表存储信息的同时更新这个字段。但是 这么做又感觉很别扭 我对明细表做操作又没对物料表做操作为什么每次都要更新物料表,而且一张操作表的更新点有很多。

  怎么想也找不到最佳方案,哪位大神能给分析下吗。

七月随风的主页 七月随风 | 初学一级 | 园豆:62
提问于:2016-08-08 12:18
< >
分享
最佳答案
0

你要是觉得在“物料表中增加一个最近时间字段”很别扭,那就在每张操作明细表的物料表id、updatetime上加上索引(updatetime要倒序,因为你要取最近的),这样你的存储过程里面,就单独根据物料表id分别去获取5,6张操作明细表的最大更新时间最好这样写“SELECT TOP 1 * FROM xxx WHERE 物料表id = x ORDER BY update_time DESC ”因为order by 后面的字段通常会走索引的,而且效率非常高,单表操作千万级的应该都是毫秒出数据的(预测值,没做实际测试),分别取出来的数据可以再放到一张表中,最后再从表中拿出你要的数据,具体写法可以参考下面:

DECLARE @vt_wuliao_updaretime_max TABLE(
    wuliao_id INT,
    caozuo_type TINYINT, --加工-1、质检-2、评分-3、针对物料提出的问题-4
    updatetime DATETIME
)

INSERT INTO @vt_wuliao_updaretime_max
SELECT TOP 1 wuliao_id,1,update_time FROM 加工表 WHERE wuliao_id = 2 ORDER BY update_time DESC

INSERT INTO @vt_wuliao_updaretime_max
SELECT TOP 1 wuliao_id,1,update_time FROM 质检表 WHERE wuliao_id = 2 ORDER BY update_time DESC

INSERT INTO @vt_wuliao_updaretime_max
SELECT TOP 1 wuliao_id,1,update_time FROM 评分表 WHERE wuliao_id = 2 ORDER BY update_time DESC

INSERT INTO @vt_wuliao_updaretime_max
SELECT TOP 1 wuliao_id,1,update_time FROM 问题表 WHERE wuliao_id = 2 ORDER BY update_time DESC

SELECT TOP 1 wuliao_id,1,update_time FROM @vt_wuliao_updaretime_max ORDER BY update_time DESC

@vt_wuliao_updaretime_max 此表可以放你要的数据最后输出即可,我这里只是简单举例,你按照你实际业务来处理应该没啥问题了,有关于大量数据统计优化的问题可以私聊我

 

收获园豆:30
破晓幽灵 | 初学一级 |园豆:41 | 2016-10-18 10:17

因为order by 后面的字段通常会走索引的,而且效率非常高,单表操作千万级的应该都是毫秒出数据的(预测值,没做实际测试)

这段话,我刚刚已测试,2000万数据,复合索引(A,B字段),A做where条件,B放order by,出数据是450ms(这个数值跟服务器本身配置相关)

破晓幽灵 | 园豆:41 (初学一级) | 2016-10-18 10:25

前两天比较忙,没回复。

  你说的意思就是用存储过程把查询拆开来写,更细致的控制查询。

七月随风 | 园豆:62 (初学一级) | 2016-10-19 12:32

@破晓幽灵:  没写完怎么就提交了。。  这个问题挂了有一段时间了。 当时是想看看大家有没有其它的思路的。朋友你这么走心的回复,我就结贴了。

七月随风 | 园豆:62 (初学一级) | 2016-10-19 12:35

@七月随风: 我这边也经常做大数据的统计业务,经常也是焦头烂额的,所以对一些数据统计的业务以及处理有点积累,各种存储过程的写法,数据处理,参数处理,结果处理等等都比较熟,有这方面的问题可以交流下

破晓幽灵 | 园豆:41 (初学一级) | 2016-10-20 14:27
其他回答(2)
0

其实数据上来了,查询也不会慢,几百万的数据量怕是都达不到吧?到时候在加索引又是和效率一毛钱关系都没有

如果你不想用以前的方法,那么可以在扩展一张表,保存物料表id和更新时间,每次插入加工、质检、评分是更新最后时间,这样就方便了

收获园豆:5
刘宏玺 | 园豆:14020 (专家六级) | 2016-08-08 16:43
0

只要在操作时间上加一个索引就很快 

其他的问题 你多虑了 有索引瞬间完成 没索引查到死

ps:索引等于 数据都排序过了 查最大的那个 就是查第一个 无论表有多少 都不影响查询效率

收获园豆:5
小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-08-19 17:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册