单表七千六百万数据量(oracle)进行实时汇总,sql很慢客户不能忍一下,该怎么办?

简介: 单表七千六百万数据量(oracle)进行实时汇总,sql很慢客户不能忍一下,该怎么办?

问题背景

描述

某省系统界面需要展示业务指标,该指标来自一张表如下图所示,数据量巨大。旧方案的统计逻辑是:java cron定时任务执行sql汇总插入汇总表,汇总频率一小时一次。


在进行定时汇总的时候,由于需要统计历史所有数据,尽管sql已经优化避免全表扫描但是查询sql执行时间很久。


导致:界面长时间没数据。


限制因素

  • 数据库服务器配置一般,普通Pc配置(16g内存,500g硬盘,cpu不清楚),没有ssd;
  • 上集群、大数据分析、hadoop?想多了,估计没人会(除了我,这里不谦虚了),运维成本比较高,客户也不会给那么多机器;其实我还是很想搞这个实时计算的。
  • 表没有分区,如果分区可能会好点,重建表进行表分区,但是ogg可能要重新搭建;
  • 不想改架构,把数据分表会好点,但是查询逻辑要变化;

7.png


结合问题场景分析

每一小时都要把近几年的历史数据统计一遍,历史数据又没变化,真的有必要?

该指标也不需要做到有秒级的延迟,何况提供数据的友商一天才给2次数据,数据实时性也不高;

解决方案oracle物理视图

**大道至简:用空间换时间;这是数据结构与算法里面常见的解决方案。 **

也即:把不变动的历史历史数据都加工后存储,定时汇总任务直接查加工后的数据,数据量大幅降低,提升查询速度。虽然数据不是最新的,但是至少有数据可以容忍。


物化视图概述

Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。


物化视图可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。


物化视图特点

  • 使用物化视图的目的是为了提高查询性能;
  • 物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;
  • 物化视图需要占用存储空间;
  • 当基表发生变化时,物化视图也应当刷新。
  • 这里我定的是物化视图一天更新一次。

创建语法

CREATE MATERIALIZED VIEW XX
  REFRESH  [[fast | complete | force] 
         [on demand | commit] 
         [start with date] 
         [next date] 
         [with {primary key | rowid}] 
       ]
      [ENABLE | DISABLE] QUERY REWRITE

Refresh 刷新子句

描述 当基表发生了DML操作后,实体化视图何时采用哪种方式和基表进行同步 。


  • 取值 FAST 采用增量刷新,只刷新自上次刷新以后进行的修改 ;
  • COMPLETE 对整个实体化视图进行完全的刷新 ;
  • FORCE(默认) Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用Fast方式,否则采用Complete的方式,Force选项是默认选项;
  • ON DEMAND(默认) 实体化视图在用户需要的时候进行刷新,可以手工通过 DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新 ;
  • ON COMMIT 实体化视图在对基表的DML操作提交的同时进行刷新 ;

**START WITH 第一次刷新时间 **

**

**NEXT 刷新时间间隔 **

**

**WITH PRIMARY KEY(默认) **

生成主键实体化视图,也就是说实体化视图是基于表的主键,而不是ROWID(对应于ROWID子句)。 为了生成PRIMARY KEY子句,应该在表上定义主键,否则应该用基于ROWID的实体化视图。主键实体化视图允许识别实体化视图表而不影响实体化视图增量刷新的可用性


REWRITE 字句

**

包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。

分别指出创建的实体化视图是否支持查询重写。查询重写是指当对实体化视图的基表进行查询时,Oracle会自动判断能否通过查询实体化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的实体化视图中读取数据 默认 DISABLE QUERY REWRITE

demo

 CREATE MATERIALIZED VIEW bm_dqd_znzdhs
    refresh force on demand start with sysdate next trunc(sysdate+1)
as
select ksdm swjgdm ,
       count(distinct djxh) znzdhs,
       to_date(to_char(lrrq, 'YYYY-MM-DD'), 'YYYY-MM-DD') lrrq
  from t_temp_ywtj_mx r
 where ywlx = '自助' and ksdm is not null
 group by ksdm, to_char(lrrq, 'YYYY-MM-DD');

参考

https://www.cnblogs.com/andy-wcl/p/3430995.html


感谢关注!


相关文章
|
6天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
6天前
|
SQL Oracle 关系型数据库
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
95 0
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
6天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL表达式:数据的魔法公式
【4月更文挑战第19天】探索Oracle PL/SQL表达式,体验数据的魔法公式。表达式结合常量、变量、运算符和函数,用于数据运算与转换。算术运算符处理数值计算,比较运算符执行数据比较,内置函数如TO_CHAR、ROUND和SUBSTR提供多样化操作。条件表达式如CASE和NULLIF实现灵活逻辑判断。广泛应用于SQL查询和PL/SQL程序,助你驾驭数据,揭示其背后的规律与秘密,成为数据魔法师。
|
6天前
|
SQL Oracle 关系型数据库
Oracle系列十一:PL/SQL
Oracle系列十一:PL/SQL
|
6天前
|
SQL Oracle 关系型数据库
Oracle系列之八:SQL查询
Oracle系列之八:SQL查询
|
6天前
|
SQL 存储 Oracle
oracle如何定期备份数据库sql文件
【1月更文挑战第7天】oracle如何定期备份数据库sql文件
64 8
|
6天前
|
SQL Oracle 关系型数据库
Oracle PL/SQL基础知识及应用案例
Oracle PL/SQL基础知识及应用案例
38 0