葡萄DDS 2022-01-17 08:41 采纳率: 56.3%
浏览 37
已结题

Oracle 存储过程如何实现对表的更新

项目上有这样的需求,因为客户有大量的统计数据的要求,所以需要将业务系统的数据,通过查询语句来获得想要的统计结果
客户目前的实现方式是直接通过SQL语句和视图来实现,但随着数据量日渐庞大,分析场景又越来越多,想改变一种思路。

计划利用存储过程,实现将原始数据通过存储过程加工后,写入到一个单独的表中,这个表是建立在一个单独的用户和表空间下,一方面能提升性能,另一方面可以加密SQL代码。

但是遇到一个问题,就是如何实现对表的变动更新,即原始表发生变动后,仅将变动后的统计结果写入新表中,这其中有几个细节:
1、在一个存储过程或存储过程用到的查询中,_原始表不止一个_;
2、原始表变动并不仅仅是INSERT,存在UPDATE和DELETE也比较多,但客户不让用触发器;
3、写入新表是统计的结果,而非原始数据,这里面会_涉及到很多复杂查询_。
4、数据量真的很大,平均一张原始表就有10个G;
5、也建议客户上ETL,但是因为预算等原因,短期内可行性不大

现在的方式是在存储过程中,直接将统计表数据清空,再重新写入数据,但由于性能瓶颈,清空再写入会有个时间差,差不多10分钟左右,这期间如果前端程序在同时查询这张表,就会反应没有结果,客户对数据更新时间要求又比较严苛,甚至想要实时数据。

所以问题来了:
** 想问一下,使用存储过程实现这样的思路,如何实现只对变化的数据进行更新?如果这个思路不可行,那么应该如何优化,来提升数据更新性能呢?**

  • 写回答

2条回答 默认 最新

  • 於黾 2022-01-17 08:53
    关注

    首先,你的数据不仅仅是个映射,而是通过计算后的统计,那么当你改动一个原始数据,能预测结果会如何变吗?
    如果一个原始数据只影响一个结果数据,一一对应,那还有可操作的空间;如果结果数据本来就是原始数据的多重冗余计算,并且引入了复杂的逻辑判断,那就实际上根本不可行。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月29日
  • 修改了问题 1月17日
  • 创建了问题 1月17日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog