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

求助: 面对 千万级别的数据 进行统计,谁有解决方案? 
过程:一个表,表有70列,3千万行, 先用where筛选 可能 还有 5个左右like查询,group by 三个列,得到新的table,再对这个table 进行至少2层嵌套的sum,count等.求答案.先谢谢了.

1)原表3千万行, where筛选出来的就有500万行~800W.再对这个结果进行至少2次嵌套统计,  
中间统计我想过了,但因为提交的数据是有范围的,即范围和条件不固定.无规律可找,所以没法提前处理数据,只有等客户提交条件后才能方向统计

2)下面是一条sql

exec('
SELECT 
CASE WHEN 参与评价处方数 IS NULL THEN 0 
Case这里省略10个Case
into ['+@OldTable+']
from
(
SELECT
COUNT(1) as 参与评价处方数,
SUM(YPZS) as 用药品种总数,
这里省掉10个以上sum
SUM(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个以上sum
AS JZKJYCFCS
FROM
{0}
GROUP BY VISIT_DATE, PATIENT_ID, ORDERED_BY
Having 1=1 {1}
)
 AS TEMP 
) as A
CREATE TABLE ['+@Table+']
这里省掉70个列,
下面是建表和索引.针对新查出来的表
UPDATE ['+@Table+']
SET 平均每张处方用药品种数 = case when
下面再省掉所有列的update部分,
下面是 row_number()的分页

3)以上语句大写字母是列的名称或别名,{}里面是传入的其它条件或表名


有只小跳蛙
浏览 1359回答 2
2回答

MM们

建议思路, 上面示例代码,皆是大批量的查询,增加适当的索引, 查看执行时的执行计划, 从右到左查看其数据流, 能尽早CUT掉的数据就尽早用WHERE条件去掉, 分析最合适的索引建在需要的表上, 在建索引时尽量Include选择中的所有列, 保证索引覆盖,如列太多, 将此索引建为聚族索引 补上面关于分表与缓存的建议:分表:你上面示例中至少有70列, 得仔细看它们的数据类型, 如若一行超过8K,则分表势在必行, 因为会造成一行分在两个不同的页里面存储, 导致IO降低。缓存:SQL会自动缓存的, 如果客户的条件中有很多一样的, 则可以预跑一些数据来进行缓存, 如大多都不一样, 如包含当前时间等参数, 缓存则没多少意义。

慕标琳琳

数据量太大的话要分表,我目前的做法是把要统计的部分用分表存储,然后加上缓存,也就是用空间换时间的做法
打开App,查看更多内容
随时随地看视频慕课网APP