场景描述:
上周在开发一个报表项目时遇到了一个建表效率的问题。为了优化某个维度的报表查询速度,我们专门将生产系统的相关维度的几张表整合成一张。而实际需求就是要从生产库同步那几张表数据回来并处理成这一张表。
由于这个表的建立需要关联好几张无索引的十万级数据表,因此速度特别慢,当时实际跑了将近40分钟,在建立了索引之后,速度仍然没有很大的提升。
解决方案:
通过很多次尝试和摸索之后,我们使用了Oracle并行处理技术,相关的操作语句是这样子的。
create table table_name nologging parallel(degree 8) AS
SELECT
...
...
实际效果:
在开了8个并行度的、无归档日志生成的模式之后,建表时间仅花了12分钟。
原理分析:
并行处理就是将一个大的数据处理分割成很多块,然后依次分配给指定的并行进程,处理完毕之后再合并结果集给用户。
应用场景分析:
于是乎,分析一下为什么并行处理和无归档日志生成适用于我们的使用场景。
首先,我们这张大表仅用于查询,通过每天同步过来的数据来生成,因此,不涉及备份,只要生产库不炸就行,因此也就不需要归档日志了。
其次,同步与建表时间是在深夜,这时候系统资源是特别充足的,所以可以通过消耗更多的系统资源来提速。
那么,归纳起来就是说,Oracle并行处理适用于处理以下场景:
- 无索引或者数据量大,可分块处理的
- 有足够的系统资源,且并发量很小
深入了解请点击Oracle 并行parallel使用案例