这个报表很慢,通过测试发现慢的原因是在关联IP地址库上表较慢,这里需要通过给定的IP地址,对比IP地址起始IP和结束IP范围找到所在区域。
通过自定义函数直接去关联或者是通过拆分对每个值去关联,这两张方式都是十几分钟,如果查询的数据量大的话直接宕机。但是不关联IP地址库的话5秒就出结果。
我最终返回的数据有将近30万的数据,IP地址库有60多万数据。最终通过两种方式处理,方式一:32秒就出数据。方式二:16秒就出数据。
原sql:
select s.ip_address ip , dp.province || dp.city || dp.county ip_address
from data_etl.t_statistics s
left outer join dim_ip_class dp
on( to_number(regexp_substr(s.ip_address, '[^.]+', 1, 1)) between
to_number(regexp_substr(dp.ip_start , '[^.]+', 1, 1)) and
to_number(regexp_substr(dp.ip_end, '[^.]+', 1, 1))
and to_number(regexp_substr(s.ip_address, '[^.]+', 1, 2)) between
to_number(regexp_substr(dp.ip_end, '[^.]+', 1, 2)) and
to_number(regexp_substr(dp.ip_end, '[^.]+', 1, 2))
and to_number(regexp_substr(s.ip_address, '[^.]