|
原帖由 newkid 于 2010-4-15 00:09 发表 ![]()
凭运气发贴:
1. 原始数据必须保留;一般维度表的ID应该是在ETL的过程中生成的,你没有这个ETL过程,就在插入的时候生成。也就是说你即有ID又有名称,因为你的数据是没有经过ETL转换的。
用INSERT...SELECT....其中SELECT的部分把维度表(浏览器,搜索引擎等)连接上去,用这些维度名称做连接键。
2. 如果你要利用浏览器表里面的其他字段做统计,就必须把浏览器表连接上去。
2.1 浏览器表还是必须的,你可能不仅仅按名称来聚合,比如按父浏览器类别来聚合。
2.2 见2的说明,是否连接上维度表根据你的查询需求来确定。
3. 关于物化视图刷新
1、 同时很多物化视图基于一个主表进行刷新,效率会低不,数据是有500W的每天,虽然物化视图也可以分区,是不是要对物化视图也分区?
这跟分区没有关系,如果你物化视图也很大才有必要刷新。
2、 有的聚合统计是在物化视图上再刷新,那能不能一个物化视图在另一个物化视图基础上再刷新,在数据一更新后,就马上更新
如果存在这样的依赖关系的物化视图,是不是要设置成on commit方式
可以,你可以把第一层的物化视图看作第二层的基础表。如果你要求两层数据是同时生成的,则第二层做成on commit方式。
3、 这么多视图同时刷新,是走快速刷新还是全部刷新呢?用什么策略刷新呢?快速刷新我怕MV LOG会过大
确实LOG会很大。
而且我怀疑能否快速刷新,特别是那些有DISTINCT的。你先试试再说。
自己写表可以根据时间戳来增量统计。
4、 由于我的数据是要一直存放的,那这个物化视图能不能像中间表一样可以一样存放数据(多长时间都行)?虽然物化视图就是一个物理表,
而且不仅仅是一张物理表。
可以一直保存。
5、 对于从基础表中聚合统计数据到物化视图中,是要用查询重写吗?
不是,查询重写是指你在基础表上运行带聚合的SQL, ORACLE会自动改写为从物化视图查询。
6、 同时刷新很多物化视图,要用刷新组的不?效率与用多个存储过程进行统计,然后将数据统计到不同的中间表里 相比,效率是更高还是
不相伯仲呢?
刷新组可以保证数据在同一个事务里,即版本一致。至于和存储过程比较,你得做试验,我怀疑其中有些是无法快速刷新的。
4. 我定时统计要触发JOB执行存储过程,是采用同时触发多个JOB并行执行,每个JOB执行个存储过程好呢还是用1个JOB触发,然后调用多个存储
过程好呢?
如果你有先后依赖关系,就用一个JOB顺序执行多个过程;多个JOB并行执行效率高,前提是你有足够资源,不会发生统计的时候前台无法插入数据。
newkid,你的意见是还是在插入基础PV表的时候,就把浏览器ID,搜索引擎ID,搜索引擎名称这样的值查询出来然后在放到基础表中不?
比如
insert into pd_pv(se_id,se_name) 由于只知道搜索引擎的域名比如www.baidu.com,那么要知道se_id,se_name要到数据库中去查询搜索引擎表得到se_id,se_name然后再插入
基础PV表,pd_pv中不。
这样弄的话,插入语句怎么写呢?目前我的插入语句是
create or replace procedure proc_pv_insert(m_id number, --自增ID
m_siteid number, --网站ID
m_visitorid varchar2, --访客ID
m_visitid varchar2, --访问ID
m_visitnum number, --第几次访问
m_referdomain varchar2, --来路域名
m_referurl varchar2, --来路页面
m_pagedomain varchar2, --受访域名
m_pageurl varchar2, --受访页面
m_pagetitle varchar2, --页面标题
m_visittime date, --访问时间
m_interval number, --访问时长
m_uniquepv number, --唯一浏览量
m_prevpage varchar2, --上一页
m_nextpage varchar2, --下一页
m_enterflag number, --进入标记
m_jumpflag number, --跳出标记
m_exitflag number, --退出标记
m_source number, --来路分类
m_iscost number, --付费流量标记
m_seid number, --搜索引擎ID
m_se varchar2, --搜索引擎名
m_keyword varchar2, --关键字
m_isnew number, --新访客标记
m_ip number, --IP地址
m_isp number, --网络接入商
m_areaid number, --地区ID
m_brwpid number, --浏览器ID
m_brwpname varchar2, --浏览器名
m_brwid number, --浏览器版本ID
m_brw varchar2, --浏览器版本名
m_ospid number, --操作系统ID
m_ospname varchar2, --操作系统名
m_osid number, --操作系统版本ID
m_os varchar2, --操作系统版本名
m_pixel varchar2, --分辨率
m_lang varchar2, --语言
m_java number, --是否支持Java
m_flash number, --是否支持Flash
m_client number, --终端类型
m_createtime date, --创建时间
m_delflag number, --删除标记
m_verflag number --版本标记
) is
begin
insert into pd_pv
(pv_id,
pv_siteid,
pv_visitorid,
pv_visitid,
pv_visitnum,
pv_referdomain,
pv_referurl,
pv_pagedomain,
pv_pageurl,
pv_pagetitle,
pv_visittime,
pv_interval,
pv_uniquepv,
pv_prevpage,
pv_nextpage,
pv_enterflag,
pv_jumpflag,
pv_exitflag,
pv_source,
pv_iscost,
pv_seid,
pv_se, pv_keyword,
pv_isnew,
pv_ip,
pv_isp,
pv_areaid,
pv_brwpid,
pv_brwpname,
pv_brwid,
pv_brw,
pv_ospid,
pv_ospname,
pv_osid,
pv_os,
pv_pixel,
pv_lang,
pv_java,
pv_flash,
pv_client,
pv_createtime,
pv_delflag,
pv_verflag)
values
(m_id,
m_siteid,
m_visitorid,
m_visitid,
m_visitnum,
m_referdomain,
m_referurl,
m_pagedomain,
m_pageurl,
m_pagetitle,
m_visittime,
m_interval,
m_uniquepv,
m_prevpage,
m_nextpage,
m_enterflag,
m_jumpflag,
m_exitflag,
m_source,
m_iscost,
m_seid,
m_se,
m_keyword,
m_isnew,
m_ip,
m_isp,
m_areaid,
m_brwpid,
m_brwpname,
m_brwid,
m_brw,
m_ospid,
m_ospname,
m_osid,
m_os,
m_pixel,
m_lang,
m_java,
m_flash,
m_client,
m_createtime,
m_delflag,
m_verflag);
commit;
end;
我打红色的就是要查别的表才能知道的值,这怎么改呢?
2. 关于IP地址的存放,是存放成192.168.18.1 这样字符串型的,还是经过转化,成为一个数字,存放为数字呢?因为数字好比较
IP地址的存放形式哪样比较好呢?效率上 我用SQL写了个IP地址转换数字的函数
3. 物化视图的实验和存储过程的效率比较我还在做 |
|