为了账号安全,请及时绑定邮箱和手机立即绑定

面对千万级别的数据 进行统计,谁有解决方案?

面对千万级别的数据 进行统计,谁有解决方案?

有只小跳蛙 2018-11-11 17:08:14
求助: 面对 千万级别的数据 进行统计,谁有解决方案? 过程:一个表,表有70列,3千万行, 先用where筛选 可能 还有 5个左右like查询,group by 三个列,得到新的table,再对这个table 进行至少2层嵌套的sum,count等.求答案.先谢谢了.1)原表3千万行, where筛选出来的就有500万行~800W.再对这个结果进行至少2次嵌套统计,  中间统计我想过了,但因为提交的数据是有范围的,即范围和条件不固定.无规律可找,所以没法提前处理数据,只有等客户提交条件后才能方向统计2)下面是一条sqlexec('SELECT CASE WHEN 参与评价处方数 IS NULL THEN 0 Case这里省略10个Caseinto ['+@OldTable+']from(SELECTCOUNT(1) as 参与评价处方数,SUM(YPZS) as 用药品种总数,这里省掉10个以上sumSUM(JZKJYCFCS) AS 急诊患者抗菌药处方数FROM(SELECT VISIT_DATE AS CFRQ, PATIENT_ID AS BRBS, ORDERED_BY AS KSDM,COUNT(1) YPZS,SUM(CASE WHEN DNDCID IS NOT NULL THEN 1 ELSE 0 END) AS TYMCS,下面省掉10个以上sumAS JZKJYCFCSFROM{0}GROUP BY VISIT_DATE, PATIENT_ID, ORDERED_BYHaving 1=1 {1}) AS TEMP ) as ACREATE TABLE ['+@Table+']这里省掉70个列,下面是建表和索引.针对新查出来的表UPDATE ['+@Table+']SET 平均每张处方用药品种数 = case when下面再省掉所有列的update部分,下面是 row_number()的分页3)以上语句大写字母是列的名称或别名,{}里面是传入的其它条件或表名
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

建议思路, 上面示例代码,皆是大批量的查询,增加适当的索引, 查看执行时的执行计划, 从右到左查看其数据流, 能尽早CUT掉的数据就尽早用WHERE条件去掉, 分析最合适的索引建在需要的表上, 在建索引时尽量Include选择中的所有列, 保证索引覆盖,如列太多, 将此索引建为聚族索引

 

补上面关于分表与缓存的建议:

分表:你上面示例中至少有70列, 得仔细看它们的数据类型, 如若一行超过8K,则分表势在必行, 因为会造成一行分在两个不同的页里面存储, 导致IO降低。

缓存:SQL会自动缓存的, 如果客户的条件中有很多一样的, 则可以预跑一些数据来进行缓存, 如大多都不一样, 如包含当前时间等参数, 缓存则没多少意义。


查看完整回答
反对 回复 2018-11-15
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

数据量太大的话要分表,我目前的做法是把要统计的部分用分表存储,然后加上缓存,也就是用空间换时间的做法

查看完整回答
反对 回复 2018-11-15
  • 2 回答
  • 0 关注
  • 1357 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信