oracle统计日均,oracle效率优化实战——计算3个月的平均值
项目需求:
根据会员在三个月里指标的平均值(有20个指标,在此以一个指标为例),按照会员所在的县级市(city_id)和行业(category_id)分别进行排名,并依据排名等级和各个指标的权重分值计算分数。
分数计算规则:
过去3个月日平均值数据量最高的或者数值最高的排名为1
0≤该客户在该县级市该行业的排名/该县级市该行业总客户数<20%:满分20%≤该客户在该县级市该行业的排名/该县级市该行业总客户数<40%:满分×0.8
40%≤该客户在该县级市该行业的排名/该县级市该行业总客户数<60%:满分×0.6
60%≤该客户在该县级市该行业的排名/该县级市该行业总客户数<80%:满分×0.4
80%≤该客户在该县级市该行业的排名/该县级市该行业总客户数<100%:满分×0.2数据为0,则分数为0
平均每条offer的点击反馈转化率权重分值为4.5分
优化之前的算法
直接根据指标的值,取它的平均值,sql如下:
SELECTl_date
,member_id
,category_id
,city_id
,decode(nvl(fb_per_pv,0),0,0,
round(decode(trunc(rank() over(PARTITIONBYcity_id,
category_idORDERBYfb_per_pvDESC) /
COUNT(*)
over(PARTITIONBYcity_id, category_id) *100/20),
0,1,1,0.8,2,0.6,3,0.4,4,0.2,5,0.2) *4.5,3))
FROM(SELECTmember_id
,city_id
,category_id
,AVG(nvl(fb_per_pv,0))ASfb_per_pv
FROMcndss.cn_loan_pre_act_sumdt0
WHEREyyyymmdd > l_date -90
GROUPBYmember_id, city_id, category_id
) t1
数据量为200w的时候,它要跑40分钟,数据量增长的时候,效率变得更差。
优化之后的算法I
我们计算平均值的算法改进:
用一个表存放三个月指标的总值,和用于计算这些指标平均值的统计天数,这样求均值就要快多了。
用于存放3个月指标值总值的指标表:
CREATETABLEcndss.cn_loan_pre_act_summt0(
yyyymmddDATENOTNULL,--TRUNC类型
member_idVARCHAR2(64)NOTNULL,--会员ID
gmt_createDATENOTNULL,--注册日期
total_daysNUMBERNOTNULL,--统计总天数
category_idNUMBER,--行业ID
city_idVARCHAR2(128),--城市ID
fb_per_pvNUMBER,--平均每条offer的点击反馈转化率
.....
)
PARTITIONBYRANGE(yyyymmdd)
(
PARTITIONP20090331VALUESLESSTHAN(TO_DATE('2009-04-01 00:00:00','YYYY-MM-DD HH24:MI:SS'))TABLESPACEtbs_cn_dss_2009
....
);
用于计算分数的sql:
SELECTl_date
,member_id
,category_id
,city_id
,decode(fb_per_pv,0,0,
round(decode(trunc(rank() over(PARTITIONBYcity_id,
category_idORDERBYfb_per_pvDESC) /
member_cnt *100/20),0,1,1,0.8,2,0.6,3,0.4,4,0.2,5,0.2) *4.5,3))
.....
FROM(SELECT/*+parallel(t,4)*/
member_id
,city_id
,category_id
,company_lib_flag
,winport_flag
,nvl(fb_per_pv,0) / total_daysASfb_per_pv
......
,COUNT(*) over(PARTITIONBYcity_id, category_id)ASmember_cnt
FROMcndss.cn_loan_pre_act_summt t
WHERE yyyymmdd = l_date
) t1;--获取平均值
我们碰到的效率问题:
每天用于统计的会员数是200w的时候,程序几分钟就跑完了,当会员数增长到450W的时候,就要几个小时,实在是让人无法忍受。而且,会员数还在不断地增加。
优化之后的算法II
新建一个临时用于统计数据基于city_id和category_id的hash临时表,把每天用于统计的会员数据插入到里面,再做统计。思路如下:
a)新建一个临时的基于city_id和category_id的hash表:
CREATETABLEcntmp.cn_loan_pre_act_tmpt1(
yyyymmddDATENOTNULL,--TRUNC类型
member_idVARCHAR2(64)NOTNULL,--会员ID
gmt_createDATENOTNULL,--注册日期
total_daysNUMBERNOTNULL,--统计总天数
category_idNUMBER,--行业ID
city_idVARCHAR2(128),--城市ID
fb_per_pvNUMBER,--平均每条offer的点击反馈转化率
……
)PARTITIONBYHASH(city_id,category_id)
(
partitiont_hash_p1tablespaceTBS_CN_TMP_00,
partitiont_hash_p2tablespaceTBS_CN_TMP_00,
partitiont_hash_p3tablespaceTBS_CN_TMP_00,
partitiont_hash_p4tablespaceTBS_CN_TMP_00,
partitiont_hash_p5tablespaceTBS_CN_TMP_00,
partitiont_hash_p6tablespaceTBS_CN_TMP_00,
partitiont_hash_p7tablespaceTBS_CN_TMP_00,
partitiont_hash_p8tablespaceTBS_CN_TMP_00,
partitiont_hash_p9tablespaceTBS_CN_TMP_00,
partitiont_hash_p10tablespaceTBS_CN_TMP_00,
partitiont_hash_p11tablespaceTBS_CN_TMP_00,
partitiont_hash_p12tablespaceTBS_CN_TMP_00,
partitiont_hash_p13tablespaceTBS_CN_TMP_00,
partitiont_hash_p14tablespaceTBS_CN_TMP_00,
partitiont_hash_p15tablespaceTBS_CN_TMP_00,
partitiont_hash_p16tablespaceTBS_CN_TMP_00
)NOLOGGING;
b)每次统计前清空数据:
TRUNCATETABLEcntmp.cn_loan_pre_act_tmpt1
c)倒入当天需要统计的数据:
INSERTINTOcntmp.cn_loan_pre_act_tmpt1
SELECT*FROMcndss.cn_loan_pre_act_summt0WHEREyyyymmdd = l_date;
COMMIT;
d)计算分值:
SELECTl_date
,member_id
,category_id
,city_id
,decode(fb_per_pv,0,0,
round(decode(trunc(rank() over(PARTITIONBYcity_id,
category_idORDERBYfb_per_pvDESC) /
member_cnt *100/20),0,1,1,0.8,2,0.6,3,0.4,4,0.2,5,0.2) *4.5,3))
.....
FROM(SELECT/*+parallel(t,4)*/
member_id
,city_id
,category_id
,company_lib_flag
,winport_flag
,nvl(fb_per_pv,0) / total_daysASfb_per_pv
.....
,COUNT(*) over(PARTITIONBYcity_id, category_id)ASmember_cnt
FROMcntmp.cn_loan_pre_act_tmpt1 t
) t1;--获取平均值
优化结果:
经过在正式环境测试,程序跑的时间缩短到25分钟左右,而且随着数据量的增加,每次跑的时间都差不多,效率得到了极大的提升。
oracle统计日均,oracle效率优化实战——计算3个月的平均值相关推荐
- oracle统计合格率,Oracle命准率及优化配置
Oracle的优化配置是非常重要的,一个合适的优化配置,可以让系统性能提高数倍:而一个不合适的配置,会导致你的系统问题不断.默认安装的Oracle是没有经过任何优化配置的,这样的配置,在自己机器上还凑 ...
- oracle统计比例,oracle实现累加,累计百分比计算
这几天一直在搞报表,发现Oracle真的很强大,需要用到累加功能,发现强大的oracle还真有,用over(order by field)解决的 例子: 数据表中最后一列就是累加的效果 累加sql: ...
- oracle统计信息内容,oracle搜集统计信息
转自http://blog.sina.com.cn/s/blog_69e7b8d701019cal.html 这里的统计信息指的是优化器(OPTIMIZER)统计信息,当Oracle数据库工作在CBO ...
- jert oracle 统计说明,Oracle JET简单入门(一)Oracle JET介绍
Oracle JET (Oracle Javascript Extension Toolkit)是一款 Oracle 的 JavaScript 拓展工具包.简单来说 Oracle JET 是一个一堆好 ...
- [Oracle] oracle统计信息
Oracle统计信息 Oracle数据库里的统计信息可以分为6种类型: 表的统计信息 索引的统计信息 列的统计信息 系统统计信息 数据字典统计信息 内部对象统计信息 图 1: Oracle统计信息 基 ...
- ORACLE统计计算
最近遇到了对一组数据进行统计计算的需求,包括平均值.总和.最大值.最小值.标准差等,代码如下: SELECT T.BUSIDATE "dimen",SUM(T.BUSI_OCCUR ...
- oracle课程小结,Oracle 数据库优化实战心得总结
一般情况下,对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化:对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化. 3.充分利用内存,优化sga.pga等(11g已经实现了sga+pg ...
- 浅析Oracle统计信息
oracle优化器(Optimizer) 优化器对于每一位从业人士都不陌生,它是oracle数据库内置的核心子系统,是数据库的核心,可以说优化器是数据库的一个灵魂,它在一定程度上决定了数据库的效率. ...
- oracle 语句提高查询效率的方法
oracle 语句提高查询效率的方法 1:.. where column in(select * from ... where ...); 2:... where exists (select 'X' ...
最新文章
- Leetcode 148. 排序链表 解题思路及C++实现
- mysql centos7 默认密码忘记_centos7 mysql忘记密码解决办法
- 【深度学习】Github上标星1.1W的PyTorch教程,我们给您搬来了
- 大数据领域33个预测,开启未知的2016
- 【第三期】那些设计漂亮、有创意的电路板!
- 如果唐朝人拿到一篇现代文章……
- 网络编程学习记录-1
- python problem
- 解决页面textarea初始焦点显示位置不正确的问题
- 为什么要用SpringCloud alibaba作为微服务开发框架?
- 【例9.7】友好城市
- MySQL 日期计算
- python读取fits第三方库_Python读取和显示Fits文件
- neo4j学习总结--第三课 Cypher(CQL)命令一
- 360抢票服务器响应,抢票首日 360浏览器成最佳
- Linux系统编程——execl函数族
- 咸鱼Micropython— 标准库
- PostgreSQL高可用中间件—Pgpool-Ⅱ
- HBase系列从入门到精通(一)
- windows10安装SQL server 2008 R2