楼主: fan0124

[精华] 再谈大数据量的数据表设计

[复制链接]
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
51#
发表于 2010-2-24 00:15 | 只看该作者
1、这目前只是对流量统计模块的所有统计字段进行统计,这个SQL怎么去写

以1.1为例:

SELECT COUNT(*) AS 网站浏览量
      ,COUNT(DISTINCT page_identfiy) AS 网站独立访客
      ,COUNT(DISTINCT page_ip) AS 网站IP数
      ,COUNT(DISTINCT page_visitid) AS 网站访问次数
  FROM pd_page
WHERE page_visittime >= TRUNC(SYSDATE)
GROUP BY page_siteid

这就不必要每个网站都写一次。
所有的公式都只保存计算因子,显示报表的时候再计算公式。

2、一共有3W个网站(虽然现在公司的资源是6000网站,但是说考虑到增长,3W个网站),这是对一个网站统计聚合出一条记录,3W个网站那就是
3W条记录

没什么问题。


3、上面的流量统计是聚合为一条记录的,但是访客环境统计就不是一条记录,多条记录

比如:按分辨率来统计,对于网站ID为1的网站统计,就会出现多种分辨率的情况,那就是多条记录

这样的情况怎么和聚合为一条的结合

是不是单独再统计,但这样就会多次查询,貌似会影响性能

必须分开统计。
如果你有办法让“一条”的数据从“多条”聚合而来,那么你可以把你的指标都集中到“多条”上,然后再从“多条”的结果得出“一条”的结果。
比如1.1, 我们认为同一个page_identfiy不可能用不同的分辨率,这就意味这这个指标是可加的(ADDITIVE),那么你就可以在按分辨率分组的同时算出来COUNT(DISTINCT page_identfiy), 然后你再聚合成一条就快得多了,甚至一条的只需要视图,实时从多条的计算出来。


4、中间表的策略:我目前是30分钟统计一次,然后记录都是插入,如果要取统计结果,就取时间最晚的一条记录(创建时间)

是这样的策略好呢,还是每一次统计,就把之前的那条统计记录给删除掉,这样一个网站一天就保持一条记录

这样哪种的效率更好呢?

如果你一天只需要一条最近的,用MERGE INTO.

5、分区按天分区,一年365天,我表空间不可能设置为几百个,怎么样平均将分区分配到各个表空间呢(分区我理解的就是分到各个表空间,分担IO压力)

轮流使用,比如你有10个表空间,一天一个用完了从头再来。

6、用不用按照网站ID来配合分区呢,3W个网站
如果你都是按问题1的方法去GROUP BY, 也就是说很少单独访问单个网站,那么就没必要再按网站来分。

7、开发组提到说要分表,说在分区的基础上,每个月再分张表出来,这样性能能好吗?
分区就相当于分表,而且是ORACLE替你管理的,所以没必要再分表。

使用道具 举报

回复
论坛徽章:
11
2010新春纪念徽章
日期:2010-03-01 11:19:072014年新春福章
日期:2014-02-18 16:42:02优秀写手
日期:2014-02-09 06:00:122011新春纪念徽章
日期:2011-02-18 11:43:34数据库板块每日发贴之星
日期:2010-12-22 01:01:01数据库板块每日发贴之星
日期:2010-11-26 01:01:012010广州亚运会纪念徽章:拳击
日期:2010-11-22 15:26:49ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2010-07-10 01:01:04数据库板块每日发贴之星
日期:2010-07-07 01:01:01
52#
 楼主| 发表于 2010-2-24 14:51 | 只看该作者
原帖由 newkid 于 2010-2-24 00:15 发表
1、这目前只是对流量统计模块的所有统计字段进行统计,这个SQL怎么去写

以1.1为例:

SELECT COUNT(*) AS 网站浏览量
      ,COUNT(DISTINCT page_identfiy) AS 网站独立访客
      ,COUNT(DISTINCT page_ip) AS 网站IP数
      ,COUNT(DISTINCT page_visitid) AS 网站访问次数
  FROM pd_page
WHERE page_visittime >= TRUNC(SYSDATE)
GROUP BY page_siteid

这就不必要每个网站都写一次。
所有的公式都只保存计算因子,显示报表的时候再计算公式。

2、一共有3W个网站(虽然现在公司的资源是6000网站,但是说考虑到增长,3W个网站),这是对一个网站统计聚合出一条记录,3W个网站那就是
3W条记录

没什么问题。


3、上面的流量统计是聚合为一条记录的,但是访客环境统计就不是一条记录,多条记录

比如:按分辨率来统计,对于网站ID为1的网站统计,就会出现多种分辨率的情况,那就是多条记录

这样的情况怎么和聚合为一条的结合

是不是单独再统计,但这样就会多次查询,貌似会影响性能

必须分开统计。
如果你有办法让“一条”的数据从“多条”聚合而来,那么你可以把你的指标都集中到“多条”上,然后再从“多条”的结果得出“一条”的结果。
比如1.1, 我们认为同一个page_identfiy不可能用不同的分辨率,这就意味这这个指标是可加的(ADDITIVE),那么你就可以在按分辨率分组的同时算出来COUNT(DISTINCT page_identfiy), 然后你再聚合成一条就快得多了,甚至一条的只需要视图,实时从多条的计算出来。


4、中间表的策略:我目前是30分钟统计一次,然后记录都是插入,如果要取统计结果,就取时间最晚的一条记录(创建时间)

是这样的策略好呢,还是每一次统计,就把之前的那条统计记录给删除掉,这样一个网站一天就保持一条记录

这样哪种的效率更好呢?

如果你一天只需要一条最近的,用MERGE INTO.

5、分区按天分区,一年365天,我表空间不可能设置为几百个,怎么样平均将分区分配到各个表空间呢(分区我理解的就是分到各个表空间,分担IO压力)

轮流使用,比如你有10个表空间,一天一个用完了从头再来。

6、用不用按照网站ID来配合分区呢,3W个网站
如果你都是按问题1的方法去GROUP BY, 也就是说很少单独访问单个网站,那么就没必要再按网站来分。

7、开发组提到说要分表,说在分区的基础上,每个月再分张表出来,这样性能能好吗?
分区就相当于分表,而且是ORACLE替你管理的,所以没必要再分表。



   
     newid,看了你的见解真是学到很多思路,SQL的运用真的很深入(尤其是COUNT和DISTINCT的组合,很精妙)

在你的基础上进行了相应的测试和改进

1、统计字段的SQL语句编写

对于流量分析

1.1.

select DISTINCT(page_siteid) AS 网站ID
      ,page_sitetitle AS 网站标题
      ,COUNT(page_id) AS PV
      ,COUNT(DISTINCT page_identify) AS 独立访客
      ,COUNT(DISTINCT page_ip) AS IP
      ,COUNT(DISTINCT page_visitid) AS 访问次数
      ,COUNT(page_id)/COUNT(DISTINCT page_identify) AS 网站人均浏览量
      ,COUNT(page_id)/COUNT(DISTINCT page_visitid) AS 网站平均浏览量
      --,COUNT(page_id)/COUNT() AS 网站唯一浏览量
      --,COUNT(page_id)/COUNT() AS 网站非跳出浏览量
      ,SUM(t1.page_visitseconds)/COUNT(DISTINCT page_visitid) AS 网站平均访问时长
      --, AS 网站跳出率
from pandian.pd_page_0223092640 t1
--where page_visittime >= TRUNC(SYSDATE)
group by page_siteid,page_sitetitle

数据确实是正确的,但是对于网站唯一浏览量、网站非跳出浏览量、网站跳出率想了半天,不知道怎么写里面的SQL

  网站唯一浏览量:公式= 网站浏览量/page_unique值为1的记录数和

  网站非跳出浏览量:公式= 网站浏览量/page_jumpflag值为0的记录数和

  网站跳出率:公式= 只访问了一个页面的访问次数(page_jumpflag为1的不重复page_visitid记录数和)/网站访问次数 * 100%

由于在COUNT()里面要对page_unique值为1进行一个筛选,也就是说要加上条件判断page_unique=1,用啥方式呢,我想过用Decode、if..else、

case...when,貌似都不行,怎么在这里面先进行一个条件的筛选,在得出数据呢?难道要嵌套语句?


1.2.“所有的公式都只保存计算因子,显示报表的时候再计算公式。”还有这句,我还是没明白。指保存临时结果?

1.3.上面的计算:,COUNT(page_id)/COUNT(DISTINCT page_visitid) AS 网站平均浏览量  公式是:网站浏览量/网站访问次数

由于网站浏览量、网站访问次数在前面是都算出来了的,可是我直接用好像就不行,还是要COUNT()这样计算下,感觉是不是很浪费性能

能有直接前面算出来的结果的方法不?


2、3W个网站,每次统计聚合记录(对于聚合成一条记录的)是3W条,不担心数据量问题,就是不知道group by这么多的网站ID,性能会不会影响

很大?


3、核心的思路是不是指:

   假设对于一个网站进行统计,统计的数据有的是可以聚合为一条的,比如:浏览量、访问次数等,有的是聚合为多条的:比如分辨率,浏览器
等,如果聚合为一条记录的统计字段也能包含在多条里的,那就集中统计为多条记录,然后在这个结果集的基础上再进行SQL统计,得出聚合为一

条记录的字段的值。(是这个意思吗?)

"甚至一条的只需要视图,实时从多条的计算出来。" 这句话没明白,用视图实时计算?


   按照这个思路我仔细整理了下统计逻辑和要求:

一、统计为一条记录:

流量分析

访客概况分析

访客回访分析

总体概况分析

二、统计为多条记录

1、流量来源分析、来路域名分析、来路页面分析

2、访客环境分析、访客环境父级分析、访客环境子级分析

   访客IP段分析、访客IP地址分析、

   访客国家分析、访客省份分析、访客区域分析

....

   也就是说聚合为一条记录的中间表只有4张,剩下的十几张中间表都是多条记录的,那就是要先集中到多条上的是吗?

   那这样的话,就要先等聚合成多条记录的结果集出来并插入到中间表后才能再进行聚合一条记录的SQL统计了,这样中间有个时间间隔要紧不?


即使这样集中了,还是有几个聚合为一条的和多条的要分开统计,这样我就要写多个Select查询的存储过程了(不可避免),不知道性能如何?

多个存储过程要放到计划任务中去


4、用MERGE INTO,那每个网站每天其实就只一条记录(更新最近的一条记录),但是对于统计的是多条记录的呢,这样更新很多条记录,会影响

性能吗?以前没想过用MERGE INTO,是觉得如果不小心,更新部分就整成更新全部了。


6、“如果你都是按问题1的方法去GROUP BY, 也就是说很少单独访问单个网站,那么就没必要再按网站来分。”  这个不太明白


附加:

1.  对于Oracle,有undo机制能够保证并发的插入查询中也不会阻塞,并发控制性的问题应该能控制好。但是对于基础表每天1000W记录,分区后

其实每个区还是1000W记录这没错吧,统计主要是对当天的这1000W记录统计,就涉及到了个插入和查询的问题,我要查询数据能够保证比较好的

性能,很短时间内统计出数据(同上面1中的SQL语句进行统计),合理建索引,但是建了索引基础表又是频繁地插入数据

  这怎么保证这1000W记录的查询和插入的效率都比较好呢?


2、从1,3延伸出来的,我把能聚合为一条记录(对于一个网站而言)的字段都一次查询出来,但是这些字段是分别位于不同的中间表中的,那我

如何将查询的数据插入不同的中间表呢,用Insert all?还是别的,毕竟Oracle里返回数据集都是用到游标(聚合为多条记录的类同)

比如:查询出的 网站浏览量、网站访问次数、历史累计浏览量、历史累计访问次数

前两个字段是插入到中间表:流量分析,后两个字段是插入到中间表:总体概况分析

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
53#
发表于 2010-2-25 00:20 | 只看该作者
1.1 你这个 DISTINCT(page_siteid) AS 网站ID 什么意思?直接 SELECT page_siteid, 因为它是GROUP BY表达式。

网站唯一浏览量:公式= 网站浏览量/page_unique值为1的记录数和 = COUNT(*)/COUNT(CASE WHEN page_uniquepv=1 THEN 1 END)

网站非跳出浏览量:公式= 网站浏览量/page_jumpflag值为0的记录数和 = COUNT(*)/COUNT(CASE WHEN page_jumpflag=0 THEN 1 END)

网站跳出率:公式= 只访问了一个页面的访问次数(page_jumpflag为1的不重复page_visitid记录数和)/网站访问次数 * 100%
= count(DISTINCT CASE WHEN page_jumpflag=0 THEN page_visitid END)/COUNT(DISTINCT page_visitid)*100

1.2.“所有的公式都只保存计算因子,显示报表的时候再计算公式。”还有这句,我还是没明白。指保存临时结果?
我是说你在设计统计表的时候,只需要把分子、分母保存为不同的列,输出报表时再计算。
以网站唯一浏览量为例,你的表已经有"网站浏览量"这个列,你只需再保存"page_unique值为1的记录数和"到另一列,输出报表时你再两个相除。


1.3.上面的计算:,COUNT(page_id)/COUNT(DISTINCT page_visitid) AS 网站平均浏览量  公式是:网站浏览量/网站访问次数
由于网站浏览量、网站访问次数在前面是都算出来了的,可是我直接用好像就不行,还是要COUNT()这样计算下,感觉是不是很浪费性能
能有直接前面算出来的结果的方法不?

所以我才要你保存公式因子,因为因子是公用的。你把这些存到表里,输出报表再用同样的因子去算不同公式。


2、3W个网站,每次统计聚合记录(对于聚合成一条记录的)是3W条,不担心数据量问题,就是不知道group by这么多的网站ID,性能会不会影响
很大?

你用循环3W次更加糟糕。一次GROUP BY最好。


3、核心的思路是不是指:
   假设对于一个网站进行统计,统计的数据有的是可以聚合为一条的,比如:浏览量、访问次数等,有的是聚合为多条的:比如分辨率,浏览器
等,如果聚合为一条记录的统计字段也能包含在多条里的,那就集中统计为多条记录,然后在这个结果集的基础上再进行SQL统计,得出聚合为一
条记录的字段的值。(是这个意思吗?)

是的,因为你这“多条”已经是从1000W里面聚合出来的假设30W条,那么你另外那个“一条”的数据只需要在30W基础上再聚合。
前提是:这些数据是可加的。


"甚至一条的只需要视图,实时从多条的计算出来。" 这句话没明白,用视图实时计算?
我的意思是,假如从“多条”(30W)聚合成“一条”(10W)的运算速度很快,你甚至没有必要设计那个“一条”的表,而是设计一个视图,这个视图就是从“多条”的统计表基础上再进行运算。


"那这样的话,就要先等聚合成多条记录的结果集出来并插入到中间表后才能再进行聚合一条记录的SQL统计了,这样中间有个时间间隔要紧不?"
你可以一起做,即多条生成后立即聚合一条的。但是,见上述,你这“一条”的统计表甚至可以省掉,只要设计一个视图。这要看实际效果了。


“即使这样集中了,还是有几个聚合为一条的和多条的要分开统计,这样我就要写多个Select查询的存储过程了(不可避免),不知道性能如何?”
该分开就得分开。至于输出,你可以用视图形成你要的样子,你可能一个SELECT就同时得到“多条”和“一条”的数据。


4、用MERGE INTO,那每个网站每天其实就只一条记录(更新最近的一条记录),但是对于统计的是多条记录的呢,这样更新很多条记录,会影响
性能吗?以前没想过用MERGE INTO,是觉得如果不小心,更新部分就整成更新全部了。

你用模拟环境测试一下MERGE INTO和INSERT的速度差异。当然程序要写好,不该更新的绝不浪费表情。


6、“如果你都是按问题1的方法去GROUP BY, 也就是说很少单独访问单个网站,那么就没必要再按网站来分。”  这个不太明白
就是说你的查询没有WHERE page_siteid=...... 这样的条件,因此没必要按page_siteid分区。你原来的思路是要运行3W次WHERE page_siteid=...... 来生成统计数据,我建议你一个GROUP BY一次生成。

附加:

1.  对于Oracle,有undo机制能够保证并发的插入查询中也不会阻塞,并发控制性的问题应该能控制好。但是对于基础表每天1000W记录,分区后

其实每个区还是1000W记录这没错吧,统计主要是对当天的这1000W记录统计,就涉及到了个插入和查询的问题,我要查询数据能够保证比较好的

性能,很短时间内统计出数据(同上面1中的SQL语句进行统计),合理建索引,但是建了索引基础表又是频繁地插入数据

  这怎么保证这1000W记录的查询和插入的效率都比较好呢?

基础表1000W建索引要谨慎,因为开销太大了。如果你主要是查询你的统计结果表而非基础表,也就是说基础表上的索引只需要为你的定时统计服务就行。


2、从1,3延伸出来的,我把能聚合为一条记录(对于一个网站而言)的字段都一次查询出来,但是这些字段是分别位于不同的中间表中的,那我

如何将查询的数据插入不同的中间表呢,用Insert all?还是别的,毕竟Oracle里返回数据集都是用到游标(聚合为多条记录的类同)

是的用INSERT ALL, 不要用游标。

使用道具 举报

回复
论坛徽章:
11
2010新春纪念徽章
日期:2010-03-01 11:19:072014年新春福章
日期:2014-02-18 16:42:02优秀写手
日期:2014-02-09 06:00:122011新春纪念徽章
日期:2011-02-18 11:43:34数据库板块每日发贴之星
日期:2010-12-22 01:01:01数据库板块每日发贴之星
日期:2010-11-26 01:01:012010广州亚运会纪念徽章:拳击
日期:2010-11-22 15:26:49ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2010-07-10 01:01:04数据库板块每日发贴之星
日期:2010-07-07 01:01:01
54#
 楼主| 发表于 2010-2-25 10:57 | 只看该作者
原帖由 newkid 于 2010-2-25 00:20 发表
1.1 你这个 DISTINCT(page_siteid) AS 网站ID 什么意思?直接 SELECT page_siteid, 因为它是GROUP BY表达式。

网站唯一浏览量:公式= 网站浏览量/page_unique值为1的记录数和 = COUNT(*)/COUNT(CASE WHEN page_uniquepv=1 THEN 1 END)

网站非跳出浏览量:公式= 网站浏览量/page_jumpflag值为0的记录数和 = COUNT(*)/COUNT(CASE WHEN page_jumpflag=0 THEN 1 END)

网站跳出率:公式= 只访问了一个页面的访问次数(page_jumpflag为1的不重复page_visitid记录数和)/网站访问次数 * 100%
= count(DISTINCT CASE WHEN page_jumpflag=0 THEN page_visitid END)/COUNT(DISTINCT page_visitid)*100

1.2.“所有的公式都只保存计算因子,显示报表的时候再计算公式。”还有这句,我还是没明白。指保存临时结果?
我是说你在设计统计表的时候,只需要把分子、分母保存为不同的列,输出报表时再计算。
以网站唯一浏览量为例,你的表已经有"网站浏览量"这个列,你只需再保存"page_unique值为1的记录数和"到另一列,输出报表时你再两个相除。


1.3.上面的计算:,COUNT(page_id)/COUNT(DISTINCT page_visitid) AS 网站平均浏览量  公式是:网站浏览量/网站访问次数
由于网站浏览量、网站访问次数在前面是都算出来了的,可是我直接用好像就不行,还是要COUNT()这样计算下,感觉是不是很浪费性能
能有直接前面算出来的结果的方法不?

所以我才要你保存公式因子,因为因子是公用的。你把这些存到表里,输出报表再用同样的因子去算不同公式。


2、3W个网站,每次统计聚合记录(对于聚合成一条记录的)是3W条,不担心数据量问题,就是不知道group by这么多的网站ID,性能会不会影响
很大?

你用循环3W次更加糟糕。一次GROUP BY最好。


3、核心的思路是不是指:
   假设对于一个网站进行统计,统计的数据有的是可以聚合为一条的,比如:浏览量、访问次数等,有的是聚合为多条的:比如分辨率,浏览器
等,如果聚合为一条记录的统计字段也能包含在多条里的,那就集中统计为多条记录,然后在这个结果集的基础上再进行SQL统计,得出聚合为一
条记录的字段的值。(是这个意思吗?)

是的,因为你这“多条”已经是从1000W里面聚合出来的假设30W条,那么你另外那个“一条”的数据只需要在30W基础上再聚合。
前提是:这些数据是可加的。


"甚至一条的只需要视图,实时从多条的计算出来。" 这句话没明白,用视图实时计算?
我的意思是,假如从“多条”(30W)聚合成“一条”(10W)的运算速度很快,你甚至没有必要设计那个“一条”的表,而是设计一个视图,这个视图就是从“多条”的统计表基础上再进行运算。


"那这样的话,就要先等聚合成多条记录的结果集出来并插入到中间表后才能再进行聚合一条记录的SQL统计了,这样中间有个时间间隔要紧不?"
你可以一起做,即多条生成后立即聚合一条的。但是,见上述,你这“一条”的统计表甚至可以省掉,只要设计一个视图。这要看实际效果了。


“即使这样集中了,还是有几个聚合为一条的和多条的要分开统计,这样我就要写多个Select查询的存储过程了(不可避免),不知道性能如何?”
该分开就得分开。至于输出,你可以用视图形成你要的样子,你可能一个SELECT就同时得到“多条”和“一条”的数据。


4、用MERGE INTO,那每个网站每天其实就只一条记录(更新最近的一条记录),但是对于统计的是多条记录的呢,这样更新很多条记录,会影响
性能吗?以前没想过用MERGE INTO,是觉得如果不小心,更新部分就整成更新全部了。

你用模拟环境测试一下MERGE INTO和INSERT的速度差异。当然程序要写好,不该更新的绝不浪费表情。


6、“如果你都是按问题1的方法去GROUP BY, 也就是说很少单独访问单个网站,那么就没必要再按网站来分。”  这个不太明白
就是说你的查询没有WHERE page_siteid=...... 这样的条件,因此没必要按page_siteid分区。你原来的思路是要运行3W次WHERE page_siteid=...... 来生成统计数据,我建议你一个GROUP BY一次生成。

附加:

1.  对于Oracle,有undo机制能够保证并发的插入查询中也不会阻塞,并发控制性的问题应该能控制好。但是对于基础表每天1000W记录,分区后

其实每个区还是1000W记录这没错吧,统计主要是对当天的这1000W记录统计,就涉及到了个插入和查询的问题,我要查询数据能够保证比较好的

性能,很短时间内统计出数据(同上面1中的SQL语句进行统计),合理建索引,但是建了索引基础表又是频繁地插入数据

  这怎么保证这1000W记录的查询和插入的效率都比较好呢?

基础表1000W建索引要谨慎,因为开销太大了。如果你主要是查询你的统计结果表而非基础表,也就是说基础表上的索引只需要为你的定时统计服务就行。


2、从1,3延伸出来的,我把能聚合为一条记录(对于一个网站而言)的字段都一次查询出来,但是这些字段是分别位于不同的中间表中的,那我

如何将查询的数据插入不同的中间表呢,用Insert all?还是别的,毕竟Oracle里返回数据集都是用到游标(聚合为多条记录的类同)

是的用INSERT ALL, 不要用游标。




   
        经过了一轮测试,测试数据是制造的标准业务数据(和实际生产环境中的数据形式是完全符合的)

  newid兄,对于上述1.1. 1.2. 1.3.和2中你说到的

1、测试数据量接近400W

SQL语句(在你提出的意见的基础上修改了):

select page_siteid AS 网站ID
      ,COUNT(page_id) AS PV
      ,COUNT(DISTINCT page_identify) AS 独立访客
      ,COUNT(DISTINCT page_ip) AS IP
      ,COUNT(DISTINCT page_visitid) AS 访问次数
      ,COUNT(page_id)/COUNT(DISTINCT page_identify) AS 网站人均浏览量
      ,COUNT(page_id)/COUNT(DISTINCT page_visitid) AS 网站平均浏览量
      ,COUNT(CASE WHEN page_uniquepv = 1 THEN 1 END) AS 网站唯一浏览量
      ,COUNT(CASE WHEN page_jumpflag=0 THEN 1 END) AS 网站非跳出浏览量
      ,SUM(page_visitseconds)/COUNT(DISTINCT page_visitid) AS 网站平均访问时长
      ,count(DISTINCT CASE WHEN page_jumpflag=1 THEN page_visitid END)/COUNT(DISTINCT page_visitid) AS 网站跳出率
from pandian.pd_page_0223092640 t1
--where page_visittime >= TRUNC(SYSDATE)
group by page_siteid


插入1000W数据,无索引,流量分析统计

1、1463369记录时,3.016秒,统计:网站ID,访问次数   20005网站

2、1676069记录时,3.672秒,统计:多了PV  20005网站

3、1974969记录时,3.453秒,统计:同上  20005网站

4、2230469记录时,15.9222秒,统计:多了独立访客、IP  20005网站

5、2369419记录时,18.75秒,统计:同上  20005网站

6、2581469记录时,20.39秒,统计:多了网站平均访问时长  20005网站

7、3228069记录时,30.859秒,统计:再把网站平均访问时长去掉  20005网站

8、3483569记录时,34.235秒,统计:把网站平均访问时长再加上  20005网站

9、3604019记录时,31.187秒,统计:加上网站人均浏览量,平均浏览量  20005网站

10、3806444记录时,27.375秒,统计:同上  20005网站

11、3806444记录时,25.39秒,统计:同上  20005网站

12、3806444记录时,25.594秒,统计:同上  20005网站

13、3806444记录时,25.86秒,统计:同上  20005网站

14、3806444记录时,25.578秒,统计:同上  20005网站


15、3806463记录时,37.125秒,统计:全加上  20005网站

16、同上,第二次执行,38.907秒

17、同上,第三次执行,36.156秒

18、同上,第四次执行,34.843秒


  统计都是在插入数据的同时进行的SQL统计,大概插入频率是 1W记录/5秒,目前是插入到接近400W记录


1.1、 说的计算因子我是放的单独一列,比如浏览量pv,可是我拿来用的时候就出错,

比如:,COUNT(page_id)/COUNT(DISTINCT page_identify) AS 网站人均浏览量  (这个肯定对)

      ,PV/COUNT(DISTINCT page_identify) AS 网站人均浏览量  (这个就错了)

PV这个字段值是在它前面查询得出的啊,

,COUNT(page_id) AS PV
,COUNT(DISTINCT page_identify) AS 独立访客
,COUNT(DISTINCT page_ip) AS IP
,COUNT(DISTINCT page_visitid) AS 访问次数
,COUNT(page_id)/COUNT(DISTINCT page_identify) AS 网站人均浏览量

难道是数据记录还没进去?还望指点这个计算因子是怎么引用?


1.2、我用的数据库是Oracle11g R2,R2里不是已经增加了象MySQL中一样的SQL结果缓存了吗?

而且本来第一次解析SQL语句是走的硬解析,第二次解析应该就是软解析了(而且我执行的这个

SQL语句从符号到大小写可都是没变的,应该走软解析的啊)

可是你看上面列出的:

    15、3806463记录时,37.125秒,统计:全加上  20005网站

    16、同上,第二次执行,38.907秒

    17、同上,第三次执行,36.156秒

    18、同上,第四次执行,34.843秒

第一次执行慢点是硬解析,没话说,可第二次,第三次,第四次怎么时间还是相差无几呢?应该快多的啊?郁闷,不解


1.3、目前是没建索引,还没到1000W数据的情况下测试的SQL(这还只是部分的统计,还有几个模块的统计还没放上),速度感觉有点

不太理想,建索引确实要谨慎,那我对page_siteid建索引如何,毕竟group by走的siteid,应该走B+索引还是有序排列,比较快的吧?


附加:

1、在SQL测试后,我想到很多高可用环境下的数据库服务器搭建比如说几百台,几千台,是不是指所有服务器都跑相同的数据库实例,然后

通过这样来缓解IO,这样可以提高查询和插入的速度(从架构上来说的话)

2、前端读取数据主要是查询中间表,JOB触发的统计主要是对基础表(1000W每天),这样对基础表除了谨慎建索引再优化就是架构上的考虑了吧

比如StandBy的读写分离(貌似只是为了分担高IO吧)

使用道具 举报

回复
论坛徽章:
11
2010新春纪念徽章
日期:2010-03-01 11:19:072014年新春福章
日期:2014-02-18 16:42:02优秀写手
日期:2014-02-09 06:00:122011新春纪念徽章
日期:2011-02-18 11:43:34数据库板块每日发贴之星
日期:2010-12-22 01:01:01数据库板块每日发贴之星
日期:2010-11-26 01:01:012010广州亚运会纪念徽章:拳击
日期:2010-11-22 15:26:49ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2010-07-10 01:01:04数据库板块每日发贴之星
日期:2010-07-07 01:01:01
55#
 楼主| 发表于 2010-2-25 16:15 | 只看该作者
1000W记录的数据文件居然占用掉4948M空间,基本就是5G。

1个月——3亿条记录——150G

1个季度——12亿条记录——450G

1年——36亿条记录——1800G——过1TB了

我有点吃惊,根据我自己估计,1亿条也就几十G吧,这么一算150G。可是我测试数据1000W条记录,数据都是符合业务要求的,不是乱造的数据,看了数据文件确实

接近5G。如果这样

1. 怎么满足数据的增长,现在的测试服务器1台也就320G(PC机),按这么来,存一年的要6台了?那我这查询数据还要跨服务器(一个库可以多个服务器上的吧)

了?要走RAC?没搞过RAC

2、如果我要分区,按天分区,就算每个月的分在一个区内,也要12个区,那每个表空间岂不是要至少150G,感觉太夸张了吧

如何这样解决呢

还是有点吃惊,1000W记录怎么会有5G空间呢,我又没放大数据类型字段

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
56#
发表于 2010-2-25 23:45 | 只看该作者
1.1、 说的计算因子我是放的单独一列,比如浏览量pv,可是我拿来用的时候就出错,

比如:,COUNT(page_id)/COUNT(DISTINCT page_identify) AS 网站人均浏览量  (这个肯定对)

      ,PV/COUNT(DISTINCT page_identify) AS 网站人均浏览量  (这个就错了)

PV这个字段值是在它前面查询得出的啊,

你没有理解我的建议,这个时候你的查询里根本就不需要有这个公式,你的查询里只要有
,COUNT(page_id) AS PV
,COUNT(DISTINCT page_identify) AS DISTINCT_ID
把 PV和DISTINCT_ID保存到表里去。

那么以后你利用你的统计表来输出报表的时候,你就可以用 SELECT PV/DISTINCT_ID AS 网站人均浏览量 FROM 统计表.
设计的时候,脑子里要很清楚哪些数据是需要保存的,哪些是可以在输出的时候再计算的。


1.2、我用的数据库是Oracle11g R2,R2里不是已经增加了象MySQL中一样的SQL结果缓存了吗?

而且本来第一次解析SQL语句是走的硬解析,第二次解析应该就是软解析了(而且我执行的这个

SQL语句从符号到大小写可都是没变的,应该走软解析的啊)

在这里,解析时间和SQL执行时间相比是九牛一毛。时间都花在执行了。



1.3、目前是没建索引,还没到1000W数据的情况下测试的SQL(这还只是部分的统计,还有几个模块的统计还没放上),速度感觉有点

不太理想,建索引确实要谨慎,那我对page_siteid建索引如何,毕竟group by走的siteid,应该走B+索引还是有序排列,比较快的吧?

只有时间戳索引有用。page_siteid建索引没用。


附加:

1、在SQL测试后,我想到很多高可用环境下的数据库服务器搭建比如说几百台,几千台,是不是指所有服务器都跑相同的数据库实例,然后
通过这样来缓解IO,这样可以提高查询和插入的速度(从架构上来说的话)

没什么用,统计是集中的,只在一个实例上做。
如果你的基础表能分库,比如按网站ID分成10个库,各算各的,最终再把报表汇总到一个总库,那就可以缓解IO.


2、前端读取数据主要是查询中间表,JOB触发的统计主要是对基础表(1000W每天),这样对基础表除了谨慎建索引再优化就是架构上的考虑了吧
比如StandBy的读写分离(貌似只是为了分担高IO吧)

如果你的JOB大大影响到基础表的插入,那就要考虑另外搞一个复制库,在复制库上统计。

关于存储,现在硬盘这么便宜你还用操心吗?如果表结构不修改了,调整一下基础表的PCTFREE参数,让它存储更紧凑。

使用道具 举报

回复
论坛徽章:
11
2010新春纪念徽章
日期:2010-03-01 11:19:072014年新春福章
日期:2014-02-18 16:42:02优秀写手
日期:2014-02-09 06:00:122011新春纪念徽章
日期:2011-02-18 11:43:34数据库板块每日发贴之星
日期:2010-12-22 01:01:01数据库板块每日发贴之星
日期:2010-11-26 01:01:012010广州亚运会纪念徽章:拳击
日期:2010-11-22 15:26:49ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2010-07-10 01:01:04数据库板块每日发贴之星
日期:2010-07-07 01:01:01
57#
 楼主| 发表于 2010-3-8 16:32 | 只看该作者
原帖由 newkid 于 2010-2-25 23:45 发表
1.1、 说的计算因子我是放的单独一列,比如浏览量pv,可是我拿来用的时候就出错,

比如:,COUNT(page_id)/COUNT(DISTINCT page_identify) AS 网站人均浏览量  (这个肯定对)

      ,PV/COUNT(DISTINCT page_identify) AS 网站人均浏览量  (这个就错了)

PV这个字段值是在它前面查询得出的啊,

你没有理解我的建议,这个时候你的查询里根本就不需要有这个公式,你的查询里只要有
,COUNT(page_id) AS PV
,COUNT(DISTINCT page_identify) AS DISTINCT_ID
把 PV和DISTINCT_ID保存到表里去。

那么以后你利用你的统计表来输出报表的时候,你就可以用 SELECT PV/DISTINCT_ID AS 网站人均浏览量 FROM 统计表.
设计的时候,脑子里要很清楚哪些数据是需要保存的,哪些是可以在输出的时候再计算的。


1.2、我用的数据库是Oracle11g R2,R2里不是已经增加了象MySQL中一样的SQL结果缓存了吗?

而且本来第一次解析SQL语句是走的硬解析,第二次解析应该就是软解析了(而且我执行的这个

SQL语句从符号到大小写可都是没变的,应该走软解析的啊)

在这里,解析时间和SQL执行时间相比是九牛一毛。时间都花在执行了。



1.3、目前是没建索引,还没到1000W数据的情况下测试的SQL(这还只是部分的统计,还有几个模块的统计还没放上),速度感觉有点

不太理想,建索引确实要谨慎,那我对page_siteid建索引如何,毕竟group by走的siteid,应该走B+索引还是有序排列,比较快的吧?

只有时间戳索引有用。page_siteid建索引没用。


附加:

1、在SQL测试后,我想到很多高可用环境下的数据库服务器搭建比如说几百台,几千台,是不是指所有服务器都跑相同的数据库实例,然后
通过这样来缓解IO,这样可以提高查询和插入的速度(从架构上来说的话)

没什么用,统计是集中的,只在一个实例上做。
如果你的基础表能分库,比如按网站ID分成10个库,各算各的,最终再把报表汇总到一个总库,那就可以缓解IO.


2、前端读取数据主要是查询中间表,JOB触发的统计主要是对基础表(1000W每天),这样对基础表除了谨慎建索引再优化就是架构上的考虑了吧
比如StandBy的读写分离(貌似只是为了分担高IO吧)

如果你的JOB大大影响到基础表的插入,那就要考虑另外搞一个复制库,在复制库上统计。

关于存储,现在硬盘这么便宜你还用操心吗?如果表结构不修改了,调整一下基础表的PCTFREE参数,让它存储更紧凑。



        newkid,看了你的指点,受益匪浅,包括那个大数据量下IO的Oracle解决方案帖子,投票斑竹的活动,强烈顶你了!

目前在开始开发架构阶段了,但目前对于一个整体架构(主要是数据库整体架构方案,类似开发的系统架构)和具体的一些策略有些疑惑

1、SQL的聚合

1.1.自从你提到从统计过的多条数据再聚合为1条,统计字段确实精简了很多,目前还在整理。但是这个聚合多条记录的SQL写法上,遇到了问题

   如下:

   基础表pd_pv,部分字段

   pv_id   pv_siteid             pv_pageurl                  pv_pagedomain     pv_visitseconds
   
    1         3       http://tech.163.com/10/0209/14.html     www.163.com           10

    2         1       http://tech.163.com/10/0209/14.html     www.163.com           35

    3         1       http://tech.163.com/10/0209/15.html     www.itpub.com         52

    4         2       http://tech.163.com/10/0209/15.html     www.itpub.com         28

    5         4       http://tech.163.com/10/0209/16.html     www.qq.com            16

    6         3       http://tech.163.com/10/0209/14.html     www.163.com           32

    我是准备按照pv_pageurl来进行去重统计,以page_url为一个标准进行聚合多条记录,相同page_url对应的siteid、pagedomain、
   
    visitseconds都是完全一样的。

    执行:select distinct(t1.pv_pageurl),t1.pv_siteid from pd_pv1 t1,结果是

             pv_pageurl

    http://tech.163.com/10/0209/14.html
   
    http://tech.163.com/10/0209/15.html

    http://tech.163.com/10/0209/16.html

      
    结果是完全正确的,接下来我想把siteid也显示出来,执行:select distinct(t1.pv_pageurl),t1.pv_siteid from pd_pv1 t1 貌似对的?

    但是结果是

    pv_siteid             pv_pageurl                  
   
       3       http://tech.163.com/10/0209/14.html     

       1       http://tech.163.com/10/0209/14.html     

       1       http://tech.163.com/10/0209/15.html     

       4       http://tech.163.com/10/0209/15.html   

       5       http://tech.163.com/10/0209/16.html   

       6       http://tech.163.com/10/0209/14.html     

   这就不对了,郁闷,问题:我如何将URL对应的站点ID查询出呢,而不是如上还是6条记录,应该是三条记录才对。其他字段类同。

   这个SQL怎么弄?

1.2. 对于数据的聚合统计,因为有的不得不分开统计,没办法在一次聚合中完成,你说的

   "该分开就得分开。至于输出,你可以用视图形成你要的样子,你可能一个SELECT就同时得到“多条”和“一条”的数据。"

   这句话说的用视图形成要的样子还不是很懂,物化视图?能不能详细说下?



2、在另一个帖子关于IO的解决方案,你提出的:

      上回不是建议你分库吗?不是说基础数据和统计数据分库,而是根据网站ID来分,因为你的数据都是独立的。
   
   分开后每个库各有完整的基础数据、统计数据和统计程序。前台应用根据网站ID决定插入到哪个库。
   
   统计数据最终再汇总到一起,那个数据量就小得多了。

       是不是要用多个库,一个主库,几个备库了。然后将网站ID均衡划分(划分应该是在应用层进行判断插入哪个库了吧),最后数据汇总

   到一起,是汇总到一个库中不,比如汇总到主库,这样跨库性能还好的不?(我们目前服务器不存在跨多个地域的问题)

   
3、同2,可以在2的基础上做读写分离的架构方案不,读写分离一般都是用Standby来实现的不?貌似备份,容灾好像也用这个不,那不是重复了。

   读写分离的架构用Stream复制来实现可行的不?


4、除了上面两种,RAC有必要用吗(对于我这个业务要求来说的话),感觉RAC好像很复杂部署起来,还要共享存储(价格很高的吧,公司对

   硬件采购的预算是有一定限制的,一般尽量都走廉价PC集合在一起的),我自己从没部署过RAC,有必要采用RAC来解决这个项目吗?


5、数据存储的问题:

  可能另外个帖子和这个都说的比较大概

5.1. 测试后计算得出,单表1000W记录占用4.503G的空间,也就是说1个月就会占用130G左右的空间了,三个月的数据一个服务器就放不下了。

     如果放不下了,我如何将这张基础表pd_pv的数据分散到其他数据库服务器上?OO说用差点的存储,我没搞明白,因为我数据都要用的啊,

     不是离线备份或归档放着不动了的。如果在放其他服务器,由于1个数据文件不能放多个服务器上,1个表应该不能同时放到多个服务器上

     吧,

     那我如何将数据分布放到多台服务器上?怎么分开存放数据?基础表还是进行分区了的,怎么分开放呢?

5.2. 数据放到多个服务器上后,那备份就是要多台服务器上一起备份了?再汇总?

5.3. 目前1台服务器也就320G,那岂不是我数据要分开放到很多服务器上了,1个月就130G,1个服务器也就能放2个月,1年下来不要6个服务器?

     数据多了那备份不也需要相应数量的服务器进行专门的数据备份?还有归档

其实倒不是担心硬盘价格的问题,而是数据放不下了就要再来个服务器放,能不能就直接放硬盘上,很多硬盘放一起,貌似是共享存储了吧,如果不用RAC架构,按照2,3来是不是也可以用共享存储?

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
58#
发表于 2010-3-9 00:51 | 只看该作者
1.    结果是完全正确的,接下来我想把siteid也显示出来,执行:select distinct(t1.pv_pageurl),t1.pv_siteid from pd_pv1 t1 貌似对的?

    但是结果是

    pv_siteid             pv_pageurl                  
   
       3       http://tech.163.com/10/0209/14.html     

       1       http://tech.163.com/10/0209/14.html     

       1       http://tech.163.com/10/0209/15.html     

       4       http://tech.163.com/10/0209/15.html   

       5       http://tech.163.com/10/0209/16.html   

       6       http://tech.163.com/10/0209/14.html     

   这就不对了,郁闷,问题:我如何将URL对应的站点ID查询出呢,而不是如上还是6条记录,应该是三条记录才对。其他字段类同。

   这个SQL怎么弄?

我不明白数据为什么会这样?为什么同一个URL对应的pv_siteid有时候是1,有时候是3?
这样可以只剩下三个记录:
select t1.pv_pageurl,MAX(t1.pv_siteid) from pd_pv1 t1 GROUP BY pv_pageurl
但是我还是觉得数据有问题。
注意你的pd_pv1必须是高度规范化的,不该保存的冗余尽量去掉。

1.2. 对于数据的聚合统计,因为有的不得不分开统计,没办法在一次聚合中完成,你说的

   "该分开就得分开。至于输出,你可以用视图形成你要的样子,你可能一个SELECT就同时得到“多条”和“一条”的数据。"

   这句话说的用视图形成要的样子还不是很懂,物化视图?能不能详细说下?

视图就是一个事先写好存在数据库里的SQL而已,不是物化视图。你的原问题是:
“即使这样集中了,还是有几个聚合为一条的和多条的要分开统计,这样我就要写多个Select查询的存储过程了(不可避免),不知道性能如何?”

我的意思是,即使你分开统计、分开保存,一个SELECT(一个视图)完全可以把它们整合到一起。这取决于你要输出什么。
你举个例子说明为什么要写多个SELECT? 当然你如果要的是多个独立的输出,那当然要写多个SELECT.


2、在另一个帖子关于IO的解决方案,你提出的:

      上回不是建议你分库吗?不是说基础数据和统计数据分库,而是根据网站ID来分,因为你的数据都是独立的。
   
   分开后每个库各有完整的基础数据、统计数据和统计程序。前台应用根据网站ID决定插入到哪个库。
   
   统计数据最终再汇总到一起,那个数据量就小得多了。

       是不是要用多个库,一个主库,几个备库了。然后将网站ID均衡划分(划分应该是在应用层进行判断插入哪个库了吧),最后数据汇总

   到一起,是汇总到一个库中不,比如汇总到主库,这样跨库性能还好的不?(我们目前服务器不存在跨多个地域的问题)

这不是一个主库多个备库。每一个库都是主库,它们为不同的网站ID服务。
至于最终的汇总,那个你最好称为汇总库吧,它只包含统计结果而没有基础数据。它相当于把各个库的统计结果复制到自己本地,跨库读取的仅仅是统计结果,因此不用担心性能。

   
3、同2,可以在2的基础上做读写分离的架构方案不,读写分离一般都是用Standby来实现的不?貌似备份,容灾好像也用这个不,那不是重复了。

   读写分离的架构用Stream复制来实现可行的不?

不用STANDBY. 现在你只需要把统计结果汇总,用STREAM, 高级复制都可以。


4、除了上面两种,RAC有必要用吗(对于我这个业务要求来说的话),感觉RAC好像很复杂部署起来,还要共享存储(价格很高的吧,公司对

   硬件采购的预算是有一定限制的,一般尽量都走廉价PC集合在一起的),我自己从没部署过RAC,有必要采用RAC来解决这个项目吗?

如果你每个库都有STANDBY, 万一主库DOWN了看看业务上允许停机几分钟切换,那么不用RAC也可以。


5、数据存储的问题:
     那我如何将数据分布放到多台服务器上?怎么分开存放数据?基础表还是进行分区了的,怎么分开放呢?

一个表不能放到多台服务器上。可以放到多个数据文件,不同数据文件可在不同盘上。


5.2. 数据放到多个服务器上后,那备份就是要多台服务器上一起备份了?再汇总?
每个库各自有自己的备份。汇总和备份没关系。


5.3. 目前1台服务器也就320G,那岂不是我数据要分开放到很多服务器上了,1个月就130G,1个服务器也就能放2个月,1年下来不要6个服务器?

     数据多了那备份不也需要相应数量的服务器进行专门的数据备份?还有归档

其实倒不是担心硬盘价格的问题,而是数据放不下了就要再来个服务器放,能不能就直接放硬盘上,很多硬盘放一起,貌似是共享存储了吧,
如果不用RAC架构,按照2,3来是不是也可以用共享存储?

就是本地硬盘也可以用几个大的吧?
共享存储不是把几个硬盘堆在一起那么简单,你们可以找供应商要方案。

使用道具 举报

回复
论坛徽章:
11
2010新春纪念徽章
日期:2010-03-01 11:19:072014年新春福章
日期:2014-02-18 16:42:02优秀写手
日期:2014-02-09 06:00:122011新春纪念徽章
日期:2011-02-18 11:43:34数据库板块每日发贴之星
日期:2010-12-22 01:01:01数据库板块每日发贴之星
日期:2010-11-26 01:01:012010广州亚运会纪念徽章:拳击
日期:2010-11-22 15:26:49ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2010-07-10 01:01:04数据库板块每日发贴之星
日期:2010-07-07 01:01:01
59#
 楼主| 发表于 2010-3-10 16:07 | 只看该作者
原帖由 newkid 于 2010-3-9 00:51 发表
1.    结果是完全正确的,接下来我想把siteid也显示出来,执行:select distinct(t1.pv_pageurl),t1.pv_siteid from pd_pv1 t1 貌似对的?

    但是结果是

    pv_siteid             pv_pageurl                  
   
       3       http://tech.163.com/10/0209/14.html     

       1       http://tech.163.com/10/0209/14.html     

       1       http://tech.163.com/10/0209/15.html     

       4       http://tech.163.com/10/0209/15.html   

       5       http://tech.163.com/10/0209/16.html   

       6       http://tech.163.com/10/0209/14.html     

   这就不对了,郁闷,问题:我如何将URL对应的站点ID查询出呢,而不是如上还是6条记录,应该是三条记录才对。其他字段类同。

   这个SQL怎么弄?

我不明白数据为什么会这样?为什么同一个URL对应的pv_siteid有时候是1,有时候是3?
这样可以只剩下三个记录:
select t1.pv_pageurl,MAX(t1.pv_siteid) from pd_pv1 t1 GROUP BY pv_pageurl
但是我还是觉得数据有问题。
注意你的pd_pv1必须是高度规范化的,不该保存的冗余尽量去掉。

1.2. 对于数据的聚合统计,因为有的不得不分开统计,没办法在一次聚合中完成,你说的

   "该分开就得分开。至于输出,你可以用视图形成你要的样子,你可能一个SELECT就同时得到“多条”和“一条”的数据。"

   这句话说的用视图形成要的样子还不是很懂,物化视图?能不能详细说下?

视图就是一个事先写好存在数据库里的SQL而已,不是物化视图。你的原问题是:
“即使这样集中了,还是有几个聚合为一条的和多条的要分开统计,这样我就要写多个Select查询的存储过程了(不可避免),不知道性能如何?”

我的意思是,即使你分开统计、分开保存,一个SELECT(一个视图)完全可以把它们整合到一起。这取决于你要输出什么。
你举个例子说明为什么要写多个SELECT? 当然你如果要的是多个独立的输出,那当然要写多个SELECT.


2、在另一个帖子关于IO的解决方案,你提出的:

      上回不是建议你分库吗?不是说基础数据和统计数据分库,而是根据网站ID来分,因为你的数据都是独立的。
   
   分开后每个库各有完整的基础数据、统计数据和统计程序。前台应用根据网站ID决定插入到哪个库。
   
   统计数据最终再汇总到一起,那个数据量就小得多了。

       是不是要用多个库,一个主库,几个备库了。然后将网站ID均衡划分(划分应该是在应用层进行判断插入哪个库了吧),最后数据汇总

   到一起,是汇总到一个库中不,比如汇总到主库,这样跨库性能还好的不?(我们目前服务器不存在跨多个地域的问题)

这不是一个主库多个备库。每一个库都是主库,它们为不同的网站ID服务。
至于最终的汇总,那个你最好称为汇总库吧,它只包含统计结果而没有基础数据。它相当于把各个库的统计结果复制到自己本地,跨库读取的仅仅是统计结果,因此不用担心性能。

   
3、同2,可以在2的基础上做读写分离的架构方案不,读写分离一般都是用Standby来实现的不?貌似备份,容灾好像也用这个不,那不是重复了。

   读写分离的架构用Stream复制来实现可行的不?

不用STANDBY. 现在你只需要把统计结果汇总,用STREAM, 高级复制都可以。


4、除了上面两种,RAC有必要用吗(对于我这个业务要求来说的话),感觉RAC好像很复杂部署起来,还要共享存储(价格很高的吧,公司对

   硬件采购的预算是有一定限制的,一般尽量都走廉价PC集合在一起的),我自己从没部署过RAC,有必要采用RAC来解决这个项目吗?

如果你每个库都有STANDBY, 万一主库DOWN了看看业务上允许停机几分钟切换,那么不用RAC也可以。


5、数据存储的问题:
     那我如何将数据分布放到多台服务器上?怎么分开存放数据?基础表还是进行分区了的,怎么分开放呢?

一个表不能放到多台服务器上。可以放到多个数据文件,不同数据文件可在不同盘上。


5.2. 数据放到多个服务器上后,那备份就是要多台服务器上一起备份了?再汇总?
每个库各自有自己的备份。汇总和备份没关系。


5.3. 目前1台服务器也就320G,那岂不是我数据要分开放到很多服务器上了,1个月就130G,1个服务器也就能放2个月,1年下来不要6个服务器?

     数据多了那备份不也需要相应数量的服务器进行专门的数据备份?还有归档

其实倒不是担心硬盘价格的问题,而是数据放不下了就要再来个服务器放,能不能就直接放硬盘上,很多硬盘放一起,貌似是共享存储了吧,
如果不用RAC架构,按照2,3来是不是也可以用共享存储?

就是本地硬盘也可以用几个大的吧?
共享存储不是把几个硬盘堆在一起那么简单,你们可以找供应商要方案。



    谢谢指正,newkid你的认真严谨确实我要学习,很惭愧。之前的测试数据有些地方还是没有完全符合业务标准,所以造成了你说的"同一个URL

对应的pv_siteid有时候是1,有时候是3? "。现在我已经仔细将测试数据全部修正过了,是完全符合实际生产环境中的情况的。但是还有如下问题


1、聚合记录的SQL的问题


   附件中的SQL脚本是我导出的测试数据表,10条记录,完全符合实际情况的,不会出现上述一个URL对应不同的站点ID这样的情况。

1.1. 之前你给出了:select t1.pv_pageurl,MAX(t1.pv_siteid) from pd_pv1 t1 GROUP BY pv_pageurl

      确实用这个可以首先得到去重后的pageurl后,同时取得对应的siteid

      但是我尝试着改写成:select t1.pv_pageurl,t1.pv_siteid from pd_pv1 t1 GROUP BY pv_pageurl,pv_siteid
      
    这样执行,结果居然也是正确的,用group by + select的字段这样就可以了吗?虽然结果正确,但是不清楚是为什么呢?


1.2. “注意你的pd_pv1必须是高度规范化的,不该保存的冗余尽量去掉。”  是不是对这个基础PV表(1000W记录/日)要保证3NF的设计?

这个表的设计如附件中图片。我在这个基础表中做了几个冗余:浏览器类别ID,浏览器类别名称,浏览器ID,浏览器名称,操作系统类别ID,操

作系统名称,操作系统ID,操作系统名称,主要是为了查询的时候不用再回表,到一些信息设置表回读来读取类似名称这样的记录。

这些冗余算合理不?还有关于地区ID,我冗余上了地区名称,这个有必要吗?


1.3. 来路统计分析中的过滤问题

来路分析是对各种来路进行分析:比如,我打开百度,输入一个阿凡达,点击搜索,那么www.baidu.com就称为来路域名,来路分类就为搜索引擎

(另外三种是 直接输入地址或收藏夹,网站推荐,Email来源),点击搜索后,在地址栏中的地址:http://www.baidu.com/s?wd=%B0%A2%B7%
  B2%B4%EF,这个就称为来路页面,我们选择底下列出的某个链接地址点击过去,比如说点到了网易的娱乐频道,那这个地址就叫受访页面。

  
  接下来,这是我写的来路分析的SQL(统计去掉重复的来路页面及页面对应的来路域名,网站ID,页面标题,来路分类和每个来路页面的PV,独
  立访客,IP数,访问次数)

  select pv_referurl AS 来路页面
      ,pv_referdomain AS 来路域名
      ,pv_siteid AS 网站ID
      ,pv_pagetitle AS 页面标题
      ,pv_source AS 来路分类
      ,COUNT(pv_id) AS PV
      ,COUNT(DISTINCT pv_visitorid) AS 独立访客
      ,COUNT(DISTINCT pv_ip) AS IP
      ,COUNT(DISTINCT pv_visitid) AS 访问次数
  from pandian.pd_pv1 t1
  --where page_visittime >= TRUNC(SYSDATE)
  group by pv_referurl,pv_referdomain,pv_siteid,pv_pagetitle,pv_source
  order by pv_siteid

  执行结果如下(附件中图也有加上结果显示,来路页面地址太长,截断了一小部分)

  来路页面                                          来路域名     网站ID   页面标题   来路分类  PV   独立访客   IP   访问次数

  http://cn.bing.com/search?q=%E6%A2%A6%E5%B9%BB   cn.bing.com      1      梦幻西游      2       1      1       1      1

  http://www.baidu.com/s?bs=%D5%F7%CD%BE&f=8&wd    www.baidu.com    1      梦幻西游      2       2      2       2      2

  http://www.baidu.com/s?wd=%D5%F7%CD%BE           www.baidu.com    3        征途        2       1      1       1      1

  http://www.google.cn/search?source=igchina&hl    www.google.com   3       海贼王       2       1      1        1     1

  http://www.baidu.com/s?bs=%BC%AB%C6%B7%B7%C9%    www.baidu.com    4      泡泡堂        2       1      1        1     1

  http://www.google.cn/search?source=igchina&hl    www.google.com   4      大话西游2     2       1      1        1      1

  http://www.baidu.com/s?bs=%C3%CE%BB%C3%CE%F7     www.baidu.com    5       死神         2       2       2       2      2

  http://www.google.cn/search?source=igchina&h     www.google.com   5      穿越火线      2       1       1       1       1

  
  问题:独立访客,IP

  由于我的测试表是10条记录,对于PV这个字段,上面8条查询记录PV的值加起来为10,这个是符合10条记录,就是PV=10的要求的。但是对于

  独立访客数,IP数却出现了问题

  这里可以看到独立访客一列,全部的值加起来也是10,说明这8个来路页面被10个不同的访客访问,可是实际情况是

  (附件中也有图)

        pv_visitorid(访客标识)           pv_siteid

  335248b6-beee-d111-7bcd-b108b17e98f3      1

  335248b6-beee-d222-7bcd-b108b17e98f4      1

  335248b6-beee-d333-7bcd-b108b17e98f1      1

  335248b6-beee-d999-7bcd-b108b17e98f8      3

  335248b6-beee-d444-7bcd-b108b17e98f8      4

  335248b6-beee-d555-7bcd-b108b17e98f1      5

  335248b6-beee-d666-7bcd-b108b17e98f1      5

  说明整个10条测试数据中,只有总共7个不同的访客,也就是说独立访客那一列全部的值加起来应该是7而不是10。原因是:不同的来路页面

  可能是由同一个访客访问的。比如来路页面A,B,都是由访客test访问的,这样统计来路页面A时,它的独立访客数是1,统计B时,它的来路

  页面也是1,这样加起来是2,可是实际是1,因为都是test访问的。

  解决:需要把其中1个的独立访客显示为0,因为都是同一个访客,这样按照访问的时间先后顺序来说,有一个来路页面的独立访客数需要是0。

     
  问题:要达到这样的效果,SQL应该怎么改写呢?


  1.4. “你举个例子说明为什么要写多个SELECT? 当然你如果要的是多个独立的输出,那当然要写多个SELECT.”

  我举个访客环境的例子,之前说到聚合记录时,按分辨率来统计,这样可以同时将访客统计出来,后来我仔细考证了下,貌似是不行的。

  例子:同上测试数据表,10条测试数据

网站ID  浏览器类别ID  浏览器类别名  浏览器ID 浏览器名     分辨率    OS类别ID  OS类别名  OS的ID   OS名称

  1        1            IE            4       IE8.0      1220*900     0       Windows     2      WindowsXP
   
  1        1            IE            3       IE7.0      1024*768     0       Windows     2      WindowsXP

  1        1            IE            3       IE7.0      1024*768     0       Windows     3      Windows2003

  3        5            FireFox       8      FireFox3.5  1440*1220    0       Windows     2      WindowsXP

  3        5            FireFox       8      FireFox3.5   1024*768    0       Windows     4      Windows7

  4        0            无类别        12      腾讯TT     1024*768     0       Windows     6      WindowsVista

  4        0            无类别        12      腾讯TT     1024*768     0       Windows     6      WindowsVista

  5        5            FireFox        7     FireFox3.0   800*600     0       Windows     4      Windows7

  5        1             IE            3       IE7.0     1220*900     1       Linux       5      RedHat

  5        1             IE            3       IE7.0     1220*900     1       Linux       5      RedHat


  如果我按分辨率来进行统计肯定就要写:

  select pv_pixel AS 分辨率
      ,pv_siteid AS 网站ID
      ,COUNT(pv_id) AS PV
      ,COUNT(DISTINCT pv_visitorid) AS 独立访客
      ,COUNT(DISTINCT pv_ip) AS IP
      ,COUNT(DISTINCT pv_visitid) AS 访问次数
  from pandian.pd_pv1 t1
  --where page_visittime >= TRUNC(SYSDATE)
  group by pv_pixel,pv_siteid
  order by pv_siteid

  得到的结果是

  分辨率     网站ID   PV    独立访客    IP数   访问次数

  1024*768     1      2        2         2         2

  1220*900     1      1        1         1          1

  1024*768     3      1        1         1          1

  1440*1220    3      1         1         1         1

  1024*768     4       2        1         2         2
   
  1220*900     5       2        1         2          2

  800*600      5       1         1         1          1

     这个是按照分辨率进行的统计,如果我按浏览器,按操作系统这样来统计,得到的PV,独立访客,IP数,访问次数都不会一样的。因此

  只能分开写Select了,没办法聚合到一条记录中实现,或者是在已聚合的数据记录基础上再聚合统计。

   
  这样的貌似只能分开select了不?如果这样分开,类似的分开统计还有几个,比如受访页面的统计,要按URL来统计一次,要按标题来统计,

  只能分开统计。同时多个select进行,很耗性能的吧,有什么可以提高性能的办法不?(我觉得这样是必须要分开统计的了)


1.5. 同1.4,对这个访客环境进行分类统计的话,我是不是要建立多个中间表,比如分辨率的,操作系统的,浏览器的,这样分开统计后放到

各自对应的中间统计表中,而不是统一放到一张表中,哪种设计方式更好呢?


1.6. “即使你分开统计、分开保存,一个SELECT(一个视图)完全可以把它们整合到一起”  这个还不是很明白,视图不是把多个表连接在一起

时可以做个视图呢?


2、架构方案

  2.1. “至于最终的汇总,那个你最好称为汇总库吧,它只包含统计结果而没有基础数据。它相当于把各个库的统计结果复制到自己本地,跨库
  读取的仅仅是统计结果,”

  是不是指单独一个库作为统计库,把每个分库的统计数据再汇总到这个库中,最后程序取数据展示只需要读取这个统计库的统计结果即可。而

  这个统计库跨库仅仅只是从多个分库中读取各自库中的统计数据汇总到一起,不进行任何别的操作,是这样的吗?

  问题: 那这个统计库要专门设置个JOB触发定时从其他分库中读取统计数据了是吧,但是如果分库中假设统计时间较长,或其它延时,而统计

         库的JOB是定时触发的,去统计但是统计数据还没到中间表,拿不到数据怎么办?

         如果统计库的JOB出现了问题,那不也就取不到数据了?

         分库的各个JOB的时间是30分钟执行一次,那这个统计库的JOB设置时间多长时间触发一次好呢?

         从分库取数据,再放到统计库中的统计表中,这个过程延时啊什么的影响大不?

  
  2.2. “不用STANDBY. 现在你只需要把统计结果汇总,用STREAM, 高级复制都可以。”

  是针对如果用读写分离这种思路,那就这样实现是吗?

  
  2.3. “万一主库DOWN了看看业务上允许停机几分钟切换,那么不用RAC也可以。”  

  这个跟RAC的采用有什么关系吗,不是很懂

  
  2.4. “每个库各自有自己的备份。汇总和备份没关系。”

  由于每个库都只是部分数据,那自己有自己的备份后,要不要把这些分开的备份数据再统一备份到某一台备份服务器上呢?

  
  2.5. “一个表不能放到多台服务器上。可以放到多个数据文件,不同数据文件可在不同盘上。”

  不是建表空间的时候或建表的时候就设置了对应的数据文件,怎么把表放到多个数据文件?这个怎么设置?而且我的基础表是分区了的,分区

  了也可以放多个数据文件上吗,怎么设置呢?

  不同的数据文件放不同的盘上,指的是同一台服务器上吧,如果是放多个服务器上呢?

  
  2.6.  不用RAC的架构的话,也可以使用共享存储不?共享存储的成本是不是很高,搭建的话比较复杂?(想尝试下,在测试环境)
  
  不知道共享存储是为了起到一个什么作用,就是集中式架构吗?

基础PV表.jpg (627.66 KB, 下载次数: 40)

基础PV表.jpg

测试表-独立访客数.jpg (292.86 KB, 下载次数: 48)

测试表-独立访客数.jpg

测试表-来路页面分析.jpg (911.34 KB, 下载次数: 49)

测试表-来路页面分析.jpg

标准页面PV测试数据.rar

2.52 KB, 下载次数: 19

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
60#
发表于 2010-3-11 00:10 | 只看该作者
1.1. 之前你给出了:select t1.pv_pageurl,MAX(t1.pv_siteid) from pd_pv1 t1 GROUP BY pv_pageurl

      确实用这个可以首先得到去重后的pageurl后,同时取得对应的siteid

      但是我尝试着改写成:select t1.pv_pageurl,t1.pv_siteid from pd_pv1 t1 GROUP BY pv_pageurl,pv_siteid
      
    这样执行,结果居然也是正确的,用group by + select的字段这样就可以了吗?虽然结果正确,但是不清楚是为什么呢?

如果一个pv_pageurl对应一个pv_siteid,那么GROUP BY pv_pageurl和GROUP BY pv_pageurl,pv_siteid分组结果就是一样的。GROUP BY就是把相同的键值归为一组。你如果还不清楚就得在SQL方面补补课了。

1.2. “注意你的pd_pv1必须是高度规范化的,不该保存的冗余尽量去掉。”  是不是对这个基础PV表(1000W记录/日)要保证3NF的设计?
是的。

这些冗余算合理不?还有关于地区ID,我冗余上了地区名称,这个有必要吗?

你仅仅是打算节省表连接的时间吗?付出的代价就是存储空间。试验一下两种表结构效率有什么不同?是否值得保存这些冗余?
FACT表的设计应该规范化,里面仅仅保存DIMENSION ID. 而DIMENSION表可以逆规范化。我觉得你要尽量减少冗余。无非就是生成统计表的时候连接的表更多些。


1.3. 来路统计分析中的过滤问题
  解决:需要把其中1个的独立访客显示为0,因为都是同一个访客,这样按照访问的时间先后顺序来说,有一个来路页面的独立访客数需要是0。

我认为你的解决并不合理。因为这个指标在不同粒度上是不可累加的。必须设计不同粒度的统计表,分别保存自己的结果。
你的例子中恰好7个访客的pv_siteid都不同。如果同一个访客访问了两个pv_siteid你要怎么办?把其中的一个算0?


  问题:要达到这样的效果,SQL应该怎么改写呢?
不管如何,你的需求可以用如下SQL来实现,我只是告诉你有这么个技巧:

  select pv_referurl AS 来路页面
      ,pv_referdomain AS 来路域名
      ,pv_siteid AS 网站ID
      ,pv_pagetitle AS 页面标题
      ,pv_source AS 来路分类
      ,COUNT(pv_id) AS PV
      ,COUNT(DISTINCT pv_visitorid) AS 独立访客
      ,COUNT(DISTINCT pv_ip) AS IP
      ,COUNT(DISTINCT pv_visitid) AS 访问次数
  from (SELECT pv_referurl,pv_referdomain,pv_siteid,pv_pagetitle,pv_source,pv_id
              ,DECODE(ROW_NUMBER() OVER(ORDER BY page_visittime),1,pv_visitorid,NULL) AS pv_visitorid
              ,DECODE(ROW_NUMBER() OVER(ORDER BY page_visittime),1,pv_ip       ,NULL) AS pv_ip
              ,DECODE(ROW_NUMBER() OVER(ORDER BY page_visittime),1,pv_visitid  ,NULL) AS pv_visitid
        pandian.pd_pv1
       )t1
  --where page_visittime >= TRUNC(SYSDATE)
  group by pv_referurl,pv_referdomain,pv_siteid,pv_pagetitle,pv_source
  order by pv_siteid;


  1.4. “你举个例子说明为什么要写多个SELECT? 当然你如果要的是多个独立的输出,那当然要写多个SELECT.”

  我举个访客环境的例子,之前说到聚合记录时,按分辨率来统计,这样可以同时将访客统计出来,后来我仔细考证了下,貌似是不行的。
  得到的结果是

  分辨率     网站ID   PV    独立访客    IP数   访问次数
     这个是按照分辨率进行的统计,如果我按浏览器,按操作系统这样来统计,得到的PV,独立访客,IP数,访问次数都不会一样的。因此

  只能分开写Select了,没办法聚合到一条记录中实现,或者是在已聚合的数据记录基础上再聚合统计。

   
  这样的貌似只能分开select了不?如果这样分开,类似的分开统计还有几个,比如受访页面的统计,要按URL来统计一次,要按标题来统计,

  只能分开统计。同时多个select进行,很耗性能的吧,有什么可以提高性能的办法不?(我觉得这样是必须要分开统计的了)

你可以先聚合到最细的粒度,比如GROUP BY 分辨率,浏览器,操作系统
这样,当你只需要分辨率时,可以在此基础上再聚合。
这个前提是一个访客对应一组固定的分辨率,浏览器,操作系统。有这个前提则统计指标是可累加的。

如果不可累加,你只能够在不同粒度上设计不同的统计结果表来存放。



1.5. 同1.4,对这个访客环境进行分类统计的话,我是不是要建立多个中间表,比如分辨率的,操作系统的,浏览器的,这样分开统计后放到

各自对应的中间统计表中,而不是统一放到一张表中,哪种设计方式更好呢?

如果不可累加你就得分开不同的表来设计。


1.6. “即使你分开统计、分开保存,一个SELECT(一个视图)完全可以把它们整合到一起”  这个还不是很明白,视图不是把多个表连接在一起

时可以做个视图呢?

视图就是一个SQL嘛,你爱怎么JOIN都可以。


2、架构方案

  2.1. “是不是指单独一个库作为统计库,把每个分库的统计数据再汇总到这个库中,最后程序取数据展示只需要读取这个统计库的统计结果即可。而这个统计库跨库仅仅只是从多个分库中读取各自库中的统计数据汇总到一起,不进行任何别的操作,是这样的吗?

是的。

  问题: 那这个统计库要专门设置个JOB触发定时从其他分库中读取统计数据了是吧,但是如果分库中假设统计时间较长,或其它延时,而统计库的JOB是定时触发的,去统计但是统计数据还没到中间表,拿不到数据怎么办?

拿到的将是旧数据,有什么关系?下次就会刷新了。ORACLE保证你读到的是提交过的数据而且版本一致。


         如果统计库的JOB出现了问题,那不也就取不到数据了?
任何环节都可能出问题,你既然预料到了就得有监控机制。

         分库的各个JOB的时间是30分钟执行一次,那这个统计库的JOB设置时间多长时间触发一次好呢?
看需求,如果不要求实时,间隔越长越好。不过我猜想应该和子库的间隔一致,否则频繁计算子库没有意义。

         从分库取数据,再放到统计库中的统计表中,这个过程延时啊什么的影响大不?
子库的统计结果都不大的话,延迟没什么要紧的。你还是得做测试然后问是否满足业务需求。
  
  2.2. “不用STANDBY. 现在你只需要把统计结果汇总,用STREAM, 高级复制都可以。”

  是针对如果用读写分离这种思路,那就这样实现是吗?

不能算是读写分离,而是负载均分吧。

  
  2.3. “万一主库DOWN了看看业务上允许停机几分钟切换,那么不用RAC也可以。”  

  这个跟RAC的采用有什么关系吗,不是很懂
RAC保证一个节点失败了其他点还能工作,真正的高可用;STANDBY需要一个切换时间,中间至少有几分钟是不可用的。
如果你愿意做复杂点,前台应用在分库插入失败时,可以考虑先把数据插入到其他库,然后恢复后再倒回来。那么你的应用就会强壮些,也可不用RAC, 代价就是增加复杂度。
  
  2.4. “每个库各自有自己的备份。汇总和备份没关系。”

  由于每个库都只是部分数据,那自己有自己的备份后,要不要把这些分开的备份数据再统一备份到某一台备份服务器上呢?

不能。备份就是为了恢复,就是单独为那个库服务。

  
  2.5. “一个表不能放到多台服务器上。可以放到多个数据文件,不同数据文件可在不同盘上。”

  不是建表空间的时候或建表的时候就设置了对应的数据文件,怎么把表放到多个数据文件?这个怎么设置?
表空间可以对应多个数据文件,随时可以增加的。你的表只考虑让它呆在哪个表空间,不要操心哪个数据文件。
  
  而且我的基础表是分区了的,分区了也可以放多个数据文件上吗,怎么设置呢?
分区可以放在不同的表空间。

  不同的数据文件放不同的盘上,指的是同一台服务器上吧,如果是放多个服务器上呢?
是同一台服务器,不能在多台服务器。

  
  2.6.  不用RAC的架构的话,也可以使用共享存储不?共享存储的成本是不是很高,搭建的话比较复杂?(想尝试下,在测试环境)
可以,但是IO就成了瓶颈。
  
  不知道共享存储是为了起到一个什么作用,就是集中式架构吗?
可以被RAC的多个节点共享。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表