欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

聚集导航出错

程序员文章站 2022-05-24 08:42:26
...

今天遇到一件很奇怪的事情:

同样的报表,在访问时,数据差异很大。

唯一做的变更是,之前底层走的是tsa_fact_punish_rstb表。现在走的是tsa_fact_punish_rdys表。

希望利用biee模型成的聚集导航,当查询特定的维度时,走相应的聚合表。

 

一开始怀疑,是tsa_fact_punish_rdys表的计算有问题,但是实际上该表是利用kettle进行简单的聚合得到的。

反复查了几次,发现底层的数据没有问题。

 

后来只能怀疑是前台的报表bug了。查看发出的sql分析,基本上关联的表是差不多的。后来仔细分析,发现在前台报表层面虽然增加了bc_type=1的判断,但是发出的sql里,走tsa_fact_punish_rdys表的查询语句,竟然没有该条件限制。导致算出来的数据偏大。

正确的sql如下:

select T4707.year_id as c1,
     T4707.month_id as c2,
     T4707.date_id as c3,
     T4635.cat_level_1_name as c4,
     case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end  as c5,
     sum(T17117.all_new_num) as c6
from 
     tsa_dim_time T4707,
     tsa_dim_punish_reason T4645,
     tsa_dim_product_category T4635,
     tsa_fact_punish_rstb T17117
where  ( T4635.cat_id = T17117.product_category_id and T4645.reason_id = T17117.reason_id and T4707.date_id = T17117.date_id and T17117.bc_type = 1 and T4635.cat_level_1_name <> '手机号码/套餐/增值业务' and T4635.cat_level_1_name <> '移动/联通/电信充值中心' and T4635.cat_level_1_name <> '网游垂直市场根类目' and T4635.cat_level_1_name <> '网游装备/游戏币/帐号/代练' and T4635.cat_level_1_name <> '网络游戏点卡' and T4635.cat_level_1_name <> '腾讯QQ专区' and T4645.reason_2_name <> '消费者保障服务(商城,虚拟)' and T4645.reason_2_name <> '消费者保障服务(集市,虚拟)' and case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end  <> '其他' and 0 < T4635.status and T4707.date_id between {d '2011-07-18'} and {d '2011-07-24'} and T17117.date_id between {d '2011-07-18'} and {d '2011-07-24'} ) 
group by T4635.cat_level_1_name, T4707.date_id, T4707.month_id, T4707.year_id, case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end 

 

错误的sql:

select T4707.year_id as c1,
     T4707.month_id as c2,
     T4707.date_id as c3,
     T4635.cat_level_1_name as c4,
     case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end  as c5,
     sum(T21533.all_new_num) as c6
from 
     tsa_dim_time T4707,
     tsa_dim_punish_reason T4645,
     tsa_dim_product_category T4635,
     tsa_fact_punish_rdys T21533
where  ( T4635.cat_id = T21533.product_category_id and T4645.reason_id = T21533.reason_id and T4707.date_id = T21533.date_id and T4635.cat_level_1_name <> '手机号码/套餐/增值业务' and T4635.cat_level_1_name <> '移动/联通/电信充值中心' and T4635.cat_level_1_name <> '网游垂直市场根类目' and T4635.cat_level_1_name <> '网游装备/游戏币/帐号/代练' and T4635.cat_level_1_name <> '网络游戏点卡' and T4645.reason_2_name <> '消费者保障服务(商城,虚拟)' and T4645.reason_2_name <> '消费者保障服务(集市,虚拟)' and case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end  <> '其他' and T4635.cat_level_1_name <> '腾讯QQ专区' and 0 < T4635.status and T4707.date_id between {d '2011-07-18'} and {d '2011-07-24'} and T21533.date_id between {d '2011-07-18'} and {d '2011-07-24'} ) 
group by T4635.cat_level_1_name, T4707.date_id, T4707.month_id, T4707.year_id, case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end 

 以上两条sql的不同点,除了走的聚合表不同外,就是条件bc_type的区别了。

 

初步分析:tsa_fact_punish_rdys表里没有bc_type字段,在聚集导航判断时,可以走这张表,竟然把这个条件直接去掉了。之前以为,没有字段映射到的话,会走符合条件的另外一个表的。这还是第一次遇到这种情况。有点诡异。

 

解决方案:在tsa_fact_punish_rdys表中增加bc_type字段,应该可以保证限制条件不丢。

 

后面再分析下,为什么会出现这种情况?

上一篇: mysql-proxy

下一篇: hibernate