说个场景:一个物料进场,我们有个物料单。然后有对这个物料管理,比如加工、质检、评分、针对物料提出的问题等等(这些操作都是并行的,也就是说不分先后,而且每个操作都会有多次)。
那我现在要显示以一个物料单为主信息的统计,其中我要统计我对物料的最近操作时间,也就是我上面说的那些操作中最近做的操作。 显而易见的方法就是每张表求max(updatetime) 然后把所有表放在一起求最大值。但是这些操作表有5、6张 这样处理就要关联很多张表,当单表数量增长上来势必要影响速度。
然后我又想到要不要在物料表中增加一个最近时间字段,然后再对每个操作表存储信息的同时更新这个字段。但是 这么做又感觉很别扭 我对明细表做操作又没对物料表做操作为什么每次都要更新物料表,而且一张操作表的更新点有很多。
怎么想也找不到最佳方案,哪位大神能给分析下吗。
你要是觉得在“物料表中增加一个最近时间字段”很别扭,那就在每张操作明细表的物料表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 此表可以放你要的数据最后输出即可,我这里只是简单举例,你按照你实际业务来处理应该没啥问题了,有关于大量数据统计优化的问题可以私聊我
因为order by 后面的字段通常会走索引的,而且效率非常高,单表操作千万级的应该都是毫秒出数据的(预测值,没做实际测试)
这段话,我刚刚已测试,2000万数据,复合索引(A,B字段),A做where条件,B放order by,出数据是450ms(这个数值跟服务器本身配置相关)
前两天比较忙,没回复。
你说的意思就是用存储过程把查询拆开来写,更细致的控制查询。
@破晓幽灵: 没写完怎么就提交了。。 这个问题挂了有一段时间了。 当时是想看看大家有没有其它的思路的。朋友你这么走心的回复,我就结贴了。
@七月随风: 我这边也经常做大数据的统计业务,经常也是焦头烂额的,所以对一些数据统计的业务以及处理有点积累,各种存储过程的写法,数据处理,参数处理,结果处理等等都比较熟,有这方面的问题可以交流下
其实数据上来了,查询也不会慢,几百万的数据量怕是都达不到吧?到时候在加索引又是和效率一毛钱关系都没有
如果你不想用以前的方法,那么可以在扩展一张表,保存物料表id和更新时间,每次插入加工、质检、评分是更新最后时间,这样就方便了
只要在操作时间上加一个索引就很快
其他的问题 你多虑了 有索引瞬间完成 没索引查到死
ps:索引等于 数据都排序过了 查最大的那个 就是查第一个 无论表有多少 都不影响查询效率