今天遇到一件很奇怪的事情:
同样的报表,在访问时,数据差异很大。
唯一做的变更是,之前底层走的是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字段,应该可以保证限制条件不丢。
后面再分析下,为什么会出现这种情况?