项目需求:

根据会员在三个月里指标的平均值(有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个月的平均值相关推荐

  1. oracle统计合格率,Oracle命准率及优化配置

    Oracle的优化配置是非常重要的,一个合适的优化配置,可以让系统性能提高数倍:而一个不合适的配置,会导致你的系统问题不断.默认安装的Oracle是没有经过任何优化配置的,这样的配置,在自己机器上还凑 ...

  2. oracle统计比例,oracle实现累加,累计百分比计算

    这几天一直在搞报表,发现Oracle真的很强大,需要用到累加功能,发现强大的oracle还真有,用over(order by field)解决的 例子: 数据表中最后一列就是累加的效果 累加sql: ...

  3. oracle统计信息内容,oracle搜集统计信息

    转自http://blog.sina.com.cn/s/blog_69e7b8d701019cal.html 这里的统计信息指的是优化器(OPTIMIZER)统计信息,当Oracle数据库工作在CBO ...

  4. jert oracle 统计说明,Oracle JET简单入门(一)Oracle JET介绍

    Oracle JET (Oracle Javascript Extension Toolkit)是一款 Oracle 的 JavaScript 拓展工具包.简单来说 Oracle JET 是一个一堆好 ...

  5. [Oracle] oracle统计信息

    Oracle统计信息 Oracle数据库里的统计信息可以分为6种类型: 表的统计信息 索引的统计信息 列的统计信息 系统统计信息 数据字典统计信息 内部对象统计信息 图 1: Oracle统计信息 基 ...

  6. ORACLE统计计算

    最近遇到了对一组数据进行统计计算的需求,包括平均值.总和.最大值.最小值.标准差等,代码如下: SELECT T.BUSIDATE "dimen",SUM(T.BUSI_OCCUR ...

  7. oracle课程小结,Oracle 数据库优化实战心得总结

    一般情况下,对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化:对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化. 3.充分利用内存,优化sga.pga等(11g已经实现了sga+pg ...

  8. 浅析Oracle统计信息

    oracle优化器(Optimizer) 优化器对于每一位从业人士都不陌生,它是oracle数据库内置的核心子系统,是数据库的核心,可以说优化器是数据库的一个灵魂,它在一定程度上决定了数据库的效率. ...

  9. oracle 语句提高查询效率的方法

    oracle 语句提高查询效率的方法 1:.. where column in(select * from ... where ...); 2:... where exists (select 'X' ...

最新文章

  1. Leetcode 148. 排序链表 解题思路及C++实现
  2. mysql centos7 默认密码忘记_centos7 mysql忘记密码解决办法
  3. 【深度学习】Github上标星1.1W的PyTorch教程,我们给您搬来了
  4. 大数据领域33个预测,开启未知的2016
  5. 【第三期】那些设计漂亮、有创意的电路板!
  6. 如果唐朝人拿到一篇现代文章……
  7. 网络编程学习记录-1
  8. python problem
  9. 解决页面textarea初始焦点显示位置不正确的问题
  10. 为什么要用SpringCloud alibaba作为微服务开发框架?
  11. 【例9.7】友好城市
  12. MySQL 日期计算
  13. python读取fits第三方库_Python读取和显示Fits文件
  14. neo4j学习总结--第三课 Cypher(CQL)命令一
  15. 360抢票服务器响应,抢票首日 360浏览器成最佳
  16. Linux系统编程——execl函数族
  17. 咸鱼Micropython— 标准库
  18. PostgreSQL高可用中间件—Pgpool-Ⅱ
  19. HBase系列从入门到精通(一)
  20. windows10安装SQL server 2008 R2

热门文章

  1. 高等数学与matlab要用电脑吗,知到高等数学与MATLAB启蒙答案全套
  2. 华为云数据库推出表数据快速恢复,细粒度解决用户误删数据问题
  3. 超实用:数字金额转成人民币大写
  4. vue3动态组件警告提示
  5. 2022年简历石沉大海,软件测试行业当前找工作有多难?
  6. python结束线程_python终止线程
  7. windows server 2008服务器管理器,添加IIS配置(2012同理)
  8. SqlServer中的dbo是什么意思?[转]
  9. zzuli1728(数学期望,组合数)
  10. IT战略规划项目方法论(德勤 埃森哲 IBM 凯捷)