问题背景
客户提出:根据券号来查询相关券活动的信息,提供 REST 接口 供查询;由于 相关券活动 是由 第三方生成,下发到我们系统,再由 我们上传回客户,这中间 那个环节出现问题不清楚,等到发现问题再处理,客户项目上需求已经来不及;故此,客户希望我们系统提供相关 接口 供查询相关 券活动 生成和推送数据
–根据 券号
查询
–券号,模板,定义数量,已收到数据路,已推送数量
问题:所查询表数据量非常巨大,响应性能必须解决
处理方法
因为 couponactivity 券活动表 数据量非常大 已经达到数千万数量,为提高效应效率;采取将相关数据汇总到 物化视图 ,接口通过查询视图来返回相关数据信息 的策略
创建物化视图日志
物化视图 日志 是 很容易建 成功的 , 但问题是 日志是能建成功 可物化视图 总会 报出 各种问题;经过反复 处理 报错的问题 查找 相关资料;
主要受益于 浅析为何Oracle物化视图对distinct, group by不支持快速刷新 、 oracle物化视图日志结构 和 Oracle物化视图、
oracle中的decode的使用
创建物化视图
首先写出 符合 预期结果的 sql 语句,然后 以创建 增量方式快速刷新 的 物化视图为 目标 处理 解决 过程中 遇到的问题
最终实现的如下物化视图
1 | --创建物化视图日志 |
创建物化视图注意点
1.创建适当的物化视图日志,是实现快速增量刷新的物化视图的前提
2.查询中需要添加 count(*) 才能实现定时自动刷新
下述是试验 sql 语句
1 | ----------------------------------------------------------------------------------------------------- |
扩展关于 DBLink 跨库查询 相关
1 | --查看 dblink信息 |
总结
主要耗时 是:在 创建了 物化视图日志之后,创建 物化视图时 报 各种问题;查找很多资料解决相关问题,原因就是 创建的 物化视图 不正确,对于这种复杂查询的 sql 查询创建的 物化视图,需要创建 primary key sequence rowid 的物化视图日志,
其中 rowid 中的列 由 group by 语句 后面 的 相关字段 有关;另外就是 对于查询结构的要求,对字符串的截取 substr 和 case 语句的 写法(类似 程序的 if else 功能)使用和学习
参考资料
浅析为何Oracle物化视图对distinct, group by不支持快速刷新