高分求一个大数量统计的解决方案

Liyingyue_FFS 2008-10-19 04:12:18
有日、周、月三种表,字段分别为(时间,手机号,上线次数),对于日表,时间字段是一个可以标示唯一一天的timeid,对于周表,时间是年和周两个字段,对于月表则是年和月两个字段。

日表中存放每天的统计数量,比如
1,13000000000,10
.....
1,13912345678,34 --到这里是timeid为1的那天的所有统计数据
2,13000000000,45
.....
2,13955555555,2
.....
.....
156,15912341234,1

日表里面每天的统计数量行大概是1300W左右,然后要根据日表来统计出周表和月表,以周表为例,统计逻辑为
select 时间,手机号,sum(上线次数) from 天表 where timeid in (这一周的timeid) group by 手机号
但是这么做很显然效率不行,统计月表的话,一次对接近4亿的数据统计效率不敢想啊

使用的是sybase iq 数据库,在手机号上面加HG索引,据说速度比较快。

特在此求一个解决方案
...全文
324 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Andy-W 2008-10-27
  • 打赏
  • 举报
回复
记号,有时间再看看
zdgood 2008-10-24
  • 打赏
  • 举报
回复
学习
tiyuzhongxin789 2008-10-20
  • 打赏
  • 举报
回复
用作业,周表每周统计一次,月表每月从周表统计一次
tim_spac 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Liyingyue_FFS 的回复:]...
每日统计数据添加到日表,然后以增量方式生成周表和月表么?
但是这么做的话,如果第一天号码A没有出现,第二天号码A出现了,这样A的数据怎么更新?怎么判断A号码是否存在?[/Quote]
假设ds_day为日表,ds_week为周表,ds_month为月表
更新本周包括两部分:

update ds_week set
cnt = a.cnt + b.cnt
from ds_day a
join ds_week b on a.number=b.number and weekid(a.day)=b.weekid

insert into ds_week
select weekid(a.day), number, cnt
from ds_day a
where day = @theday
and not exists (select 1 from ds_week b
where b.number=a.number and b.weekid=weekid(a.day))
东那个升 2008-10-20
  • 打赏
  • 举报
回复
最好做分区表!
yeah920 2008-10-20
  • 打赏
  • 举报
回复
帮你顶起来。
Liyingyue_FFS 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tim_spac 的回复:]
1. 每日统计数据添加到日表
2. 每周基于日表统计数据到周表
3. 每月基于日表统计数据到月表
[/Quote]

这么做的话担心月表统计的效率啊~~

[Quote=引用 8 楼 playwarcraft 的回复:]
數據量好大~~~
像这样的访问量统计,过去的时间,其数据是定了,我觉得需要统计的应该是当日,当周,当月,
过去式的统计都应该是定数,可以将所谓的新旧数据独立出来统计。
[/Quote]
什么意思呢?每日统计数据添加到日表,然后以增量方式生成周表和月表么?
但是这么做的话,如果第一天号码A没有出现,第二天号码A出现了,这样A的数据怎么更新?怎么判断A号码是否存在?
playwarcraft 2008-10-20
  • 打赏
  • 举报
回复
數據量好大~~~
像这样的访问量统计,过去的时间,其数据是定了,我觉得需要统计的应该是当日,当周,当月,
过去式的统计都应该是定数,可以将所谓的新旧数据独立出来统计。
tim_spac 2008-10-20
  • 打赏
  • 举报
回复
1. 每日统计数据添加到日表
2. 每周基于日表统计数据到周表
3. 每月基于日表统计数据到月表
Liyingyue_FFS 2008-10-20
  • 打赏
  • 举报
回复
sybase板块那叫一个萧条啊~~~15号挂了个问题现在还是0回复

周表一周统计一次就可以了么~~月表要求统计的是1个月的记录而不是4周,怎么从周表取数据?
水族杰纶 2008-10-20
  • 打赏
  • 举报
回复
樓主的數據量很大,處理的時候在關鍵的字段建立索引
或者做表分區
最好到對應版塊問問,在這裡提問,大家都是給你MSSQL的思路
fcuandy 2008-10-20
  • 打赏
  • 举报
回复
将统计信息定期维护到中间表中, 这样有利于性能提升。
xphqzhj 2008-10-20
  • 打赏
  • 举报
回复
up^^^^^^^^^^^^^^^^^^
Garnett_KG 2008-10-20
  • 打赏
  • 举报
回复
Sybase不知道有什么好的解决方案


mssql倒是可以考虑一下indexed view。

以周表为例:



CREATE VIEW vw_WeekReport_1
AS

SELECT 时间,手机号,sum(上线次数) from 天表 where timeid in (第1周id) group by 手机号

GO

CREATE VIEW vw_WeekReport_2
AS

SELECT 时间,手机号,sum(上线次数) from 天表 where timeid in (第2周id) group by 手机号

GO
....

天表的聚集索引建立在timeid上

而索引view的聚集索引可建在手机号上



Liyingyue_FFS 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 happyflystone 的回复:]
你的周是自然周,并不是每一个月分成的四个周?
[/Quote]
嗯 ,周是datepart(week,date)得到的周
-狙击手- 2008-10-20
  • 打赏
  • 举报
回复
你的周是自然周,并不是每一个月分成的四个周?
mjjzg 2008-10-20
  • 打赏
  • 举报
回复
up
up
Herb2 2008-10-20
  • 打赏
  • 举报
回复
哦,看错了。
我想只有通过作业了每天自动执行。

每天定时(比如日表生成的时候)将每日的统计更新到周表和月表中去。
三个表都需要在手机号上加索引
Herb2 2008-10-20
  • 打赏
  • 举报
回复
这个首先要分析你的原始数据了。

你说的日表有1300W数据,那么DISTINCT 手机号有多少条数据呢。
如果每天的手机号数据很少的话(比如在万行以内),应该是通过作业统计每日的数据。

如果是每天的手机号的数据也可多,也在百万以上,估计要进行表分区,而且最好通过硬件升级来完成(比如升级到存储阵列)
flairsky 2008-10-20
  • 打赏
  • 举报
回复
sybase iq 不熟悉

但是,把要一次性统计的步骤,拆散成零件统计应该是你该走的道路。

可以做任务,也可以做应用程序,每天统计一次甚至每小时统计一次,以后更大纬度的统计在此基础上进行
加载更多回复(7)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧