首页 新闻 会员 周边 捐助

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

0
悬赏园豆:20 [已解决问题] 解决于 2012-04-26 13:09

求助: 面对 千万级别的数据 进行统计,谁有解决方案?
过程:一个表,表有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)以上语句大写字母是列的名称或别名,{}里面是传入的其它条件或表名

mick100ey的主页 mick100ey | 初学一级 | 园豆:75
提问于:2012-04-20 10:13
< >
分享
最佳答案
0

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

 

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

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

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

收获园豆:16
Chao Hong | 菜鸟二级 |园豆:244 | 2012-04-25 17:44
其他回答(4)
0

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

收获园豆:1
artwl | 园豆:16736 (专家六级) | 2012-04-20 10:26

从你的答案中得出两个方案: 分表和缓存.

1): 仅3千万的数据, 分表意义不大. 分表后再查询时需要联合查询,这里还得把分表再联合一起查, 这时候和没分表有区别吗? union的效率 和 where后时间段的效率?

1)缓存更行不通了,缓存的目的是下次再利用, 但因为查询条件动态变化. 上次查询对本次或下次没有任何义, 因为下次查询的条件又改变了. 所以就算缓存起来,也用不上. 更何况数据库有近80G呢.

支持(0) 反对(0) mick100ey | 园豆:75 (初学一级) | 2012-04-20 13:25

从你的答案中得出两个方案: 分表和缓存.

1): 仅3千万的数据, 分表意义不大. 分表后再查询时需要联合查询,这里还得把分表再联合一起查, 这时候和没分表有区别吗? union的效率 和 where后时间段的效率?

2)缓存更行不通了,缓存的目的是下次再利用, 但因为查询条件动态变化. 上次查询对本次或下次没有任何义, 因为下次查询的条件又改变了. 所以就算缓存起来,也用不上. 更何况数据库有近80G呢.

支持(0) 反对(0) mick100ey | 园豆:75 (初学一级) | 2012-04-20 13:26
0

楼主的问题可以从数据存储和计算两个方面来进行。
存储方面,除了分表,还可以分库,比如订阅几个从库;
计算方面,可以使用并行计算框架,集群处理,这也分库的用处就体现出来了。

收获园豆:1
深蓝医生 | 园豆:409 (菜鸟二级) | 2012-04-20 11:10
-2

找一些数据库优化方面的书,看看有没有什么解决方法

期待+学习

收获园豆:1
KivenRo | 园豆:1734 (小虾三级) | 2012-04-20 13:09
-1

这个不是三言两语就说得清楚的,方法很多

收获园豆:1

方法很多? 随便说点,不需要说太多,给个思路就行.谢谢

支持(0) 反对(0) mick100ey | 园豆:75 (初学一级) | 2012-04-20 15:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册