求助: 面对 千万级别的数据 进行统计,谁有解决方案? 过程:一个表,表有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会自动缓存的, 如果客户的条件中有很多一样的, 则可以预跑一些数据来进行缓存, 如大多都不一样, 如包含当前时间等参数, 缓存则没多少意义。
- 2 回答
- 0 关注
- 1357 浏览
添加回答
举报
0/150
提交
取消