|
原帖由 newkid 于 2010-1-18 22:49 发表 ![]()
1. 你说的复制数据的“另一方面”理由不成立,你复制的相当于只是数据仓库里的“事实表”,事实表即使在源库里也应当是不变的。而你说的相当于SLOW CHANGING DIMENSION, 你要能知道每个网站的属性变化历史,这属于维度的管理。
复制数据就是为了分离负载,如果还在原库那就没必要复制。
2. 如果并发变成了串行,所有事务就会在一个地方排队,不管你怎么努力都没用的。这种设计不可扩缩,用户体验很糟糕。
如果允许统计延迟,那就设计一个JOB来统计,在允许的延迟频率触发,比如每10分钟统计一次,按结束访问的时间戳来扫描。这样所有对统计表的更新就只有一个SESSION在做,不影响原始数据的并发插入。
4. 要确定你的查询条件可以用于定位分区。分得太细可能没有意义,在分区内按索引扫描就很好了。
newid,谢谢你给了很多思路,向你学习!
1、关于页面基础数据
确实你说到SCD,我才突然想起来,我这种情况的确属于DW中的SCD(数据仓库我还理解的不深入,运用的很少,还需要请教),可能内容有所变化,但是变化的频率肯定不大。就是这张表(中
途插入图片不知道怎么插,上传附件在下面了):
下图中的基础数据表:页面
这个页面是记录原始的访问情况,也就是我们说的PV记录。在中间有个流量来源,按照业务的需求是分为了 1-直接流量 2-推荐网站 3-搜索引擎 4-Email来源 这四种,但是业务需求说可能
这个有变化,要把流量来源抽离出这个页面基础表,再复制个原始数据表。
需求分析团队给我说的就是:比如有个网站,我们以前一直是按照直接流量来统计的,标记为1。后来这个网站成为了个搜索引擎公司,于是再统计这个URL流量的时候,我们就要归结为搜索引擎,
标记为3,而不是1了。这样是不是要重新放个原始数据表,结构上和这个“页面”基础表相同,就是少了流量来源,然后再原始数据表的基础上才是这个基础数据表,就多了个流量来源。但是我觉得
完全没必要,你觉得呢?就算是现在流量来源变化成3了,以前的为1的我肯定不会变了。
如果流量来源以后会增加(基本几率很小)或者会细分(比如将推荐网站再细分为小类),这样我的数据在流量来源的标识上前后肯定不一样,还是继续维持“历史数据不可修改”的原则呢,之前
的是哪样就是哪样,不用改。
然后还是针对整个“页面”基础表,需求说要进行消重,要再多个消重表,结构字段完全一样。因为现在我设计的这个“页面”基础表,策略是记录每次PV,
比如:新打开了一个页面,这个时候要记录一次PV,就写入一条记录到“页面基础表”,如果对整个页面刷新了2次,那就继续插入2条记录到“页面基础表”
但是需求说为了后面的统计分析需要,需要消重处理。也就是要除掉这种刷新的情况。如果这样的话,我想了两种策略:
1.1. 还是就一张“页面基础表”,对于一个相同页面反复刷新的情况,我就不重新插入记录了,只是在这条记录上的字段浏览量(PV)上累加,也就是更新记录的操作了。
1.2. 加一张结构与“页面基础表”一摸一样的表,记录消重后的记录,比如:新开一个页面后,PV为1,插入一条记录,然后刷新了3次,由于是相通的页面,因此我这张表就1条记录,而先前的
“页面基础表”就是4条记录,一个是没消重的基础表,一个是消重的。
不知道选哪种策略好?插入和更新记录的性能比较哪个更大呢?
2、关联的问题
对于基础数据表,目前三张,页面 1000W条/每天, 访问次数 差不多200W条/每天 ,访客 最少了,顶多10W条/每天
但是基础数据表之间要不要关联呢,联系是很紧密的,一个访客每天的访问次数可以为多个,每次访问会看多个页面,一个页面会被多个访客看到。对于大数据量的,有的说关联性能低了,有的说
关联还是必要的。我之前看过个帖子说:两张1000W记录的表,建立关联了,查询比不建立关联查询要性能高,不知道是真是假,没试验过。
我个人觉得适当关联吧,不知道是否得当?不要中间的关联表,直接将关联的字段写在某个表中,比如页面和访客的两张基础表,我就将访客的ID在页面的基础表中加上,多一个字段,这样建立联系。
3、还是实时统计的问题:将统计定时触发执行,只是定时的间隔更短,这个确实不错,(自己怎么就没想过呢,晕死),控制在10分钟触发一次,一天也就144次。但是如果真的要实时触发呢,也就
是每次访问结束的时候触发JOB来统计,但是有个条件,同一个人访问,每次访问之间的间隔是半小时,也就是说访问结束后,半小时内的再次访问网站还是算同一次访问。这样实时触发是不是能行
如果要实时触发的统计:
3.1. 并发很高时,这个会造成很高的IO,但是如果要实现,是不是必须从整体架构上也要考虑,比如要RAC,不然抗不住
3.2. 实时触发怎么让并发不会变成串行的请求呢?通过什么策略可以改进呢,
3.3. 是否需要更多的服务器来支撑才行
3.4. 通过什么方式可以来实现实时触发呢?用现在比较好的hadoop?
还有你说的这句“这样所有对统计表的更新就只有一个SESSION在做,不影响原始数据的并发插入。”不是很懂,要解释下
4、表分区的策略
4.1. 对于我设计的日1000W数据的记录,1个月是3亿,表分区我最近都在学习研究,区间分区,列表分区,Hash分区,组合分区,我感觉好像我就只能用区间分区好些吧
按照时间戳来分区,如果按天的时间戳分区的话,那不是一年下来,要分出365个,会不会多了?
分区的这个时间戳的度上把握到哪个度好呢,是天,还是周,还是月
4.2. 分区是针对一台数据库服务器呢,还是多个?如果是分区在多个服务器上,那会不会性能影响?
4.3. 多个库的建立是不是建立在多个服务器上呢,比如我肯定为了分离负载,可能有的统计就放到另外的库中,原始的在一个库中
下面的图一个是基础表的,一个是整体的,(修改后的差不多完整版的了) |
|