巧用parallel极速提升数据加载速度

并行在平时工作中可能不是很注意,因为有时候即使设定了parallel 相关的hint,感觉性能也好不到哪去。这是我以前的感觉。
今天通过一个案例来分享一下通过parallel来使数据加载的速度达到极速提升。
现有一个很让人头疼的表,里面还有clob字段,通过exp/imp来导出导入数据,导出慢还可以接受,导入的速度大概在一秒钟1000条的速度,对于千万,上亿的数据来说,简直就是噩梦。对于数据泵,也测试了各种可能的改进方法。但是效果都不让人满意,首先就是对于undo的消耗极大,还有impdp中parallel选项因为clob无法激活。在测试环境中反复测试,时间大概保持在2个小时的样子(数据量是5千万),而且还得不断的去查看undo的使用率,有一次测试中还报了undo空间不足的错误,整个数据导入得重头再来,而且还使得高水位线受到影响。
个人反复的尝试,最后使用外部表来进行数据的分批导入,这样能够降低undo使用率,对于进度也比较好把握,比如对于大表big_table,我生成了20个外部表,把big_table里的数据分摊到了20个外部表中,这样每个外部表做完insert之后,马上commit,可以减少undo使用竞争。测试环境中测试,时间在40~60分钟左右,刚开始的时候速度很快,一分钟将近160万的数据加载速度,但是到后面速度就开始逐渐降下来了。最后150万的数据基本在5分钟左右。
一方面是外部原因,另一方面和数据库内部的机理也有关联,有些块不会很快的释放。

使用外部表Insert的方式性能要好一些,但是得改进一些地方,尤其是对于大表来说,parallel比想象中的效果要好很多,

首先来看一下一般的数据插入速度。速度在40秒左右。为了保证测试的可评估性,我每次都会换一个数据量基本一致的外部表来插入数据。
SQL>  insert into big_table select *from big_table_ext_33;
820374 rows created.

Elapsed: 00:00:40.80
SQL> commit;

尝试使用append方式插入数据,表big_table已经设置为nologging模式,有4个local partitioned 的index,都是logging模式。
速度一下子提升了不少达到了16秒。
SQL> insert /*+append*/ into big_table select *from big_table_ext_30;
960461 rows created.

Elapsed: 00:00:16.11

然后继续换一个表,使用parallel hint来插入数据。但是时间好像没有任何提升。
SQL> insert /*+append parallel(big_table 8) */ into big_table select *from big_table_ext_2;
988140 rows created.

Elapsed: 00:00:16.14
这个时候可以使用v$pq_sesstat来查看使用parallel被启用了。
SQL> select * from v$pq_sesstat;

STATISTIC                      LAST_QUERY SESSION_TOTAL
------------------------------ ---------- -------------
Queries Parallelized                    0             0
DML Parallelized                        0             0
DDL Parallelized                        0             0
DFO Trees                               0             0
Server Threads                          0             0
Allocation Height                       0             0
Allocation Width                        0             0
Local Msgs Sent                         0             0
Distr Msgs Sent                         0             0
Local Msgs Recv'd                       0             0
Distr Msgs Recv'd                       0             0
11 rows selected.
可以看到parallel的hint被oracle给忽略了。parallel dml的优先级是session >hint> object
所以继续设置session级的hint,启用parallel,这个时候如果想保证启用paralell可以使用force选项。
SQL> alter session force parallel dml parallel 8;
Session altered.
Elapsed: 00:00:00.00

再次插入数据,时间一下子降低到了6秒钟。
SQL> insert /*+append parallel(big_table 8) */ into big_table select *from big_table_ext_31;
930198 rows created.

Elapsed: 00:00:06.49
SQL> commit;

清空数据,稍候继续插入数据,来看看是否parallel被启用了。
SQL> truncate table  big_table;
Table truncated.

Elapsed: 00:00:01.34
SQL> select * from v$pq_sesstat;

STATISTIC                      LAST_QUERY SESSION_TOTAL
------------------------------ ---------- -------------
Queries Parallelized                    0             0
DML Parallelized                        0             1
DDL Parallelized                        0             0
DFO Trees                               0             1
Server Threads                          0             0
Allocation Height                       0             0
Allocation Width                        0             0
Local Msgs Sent                         0         16191
Distr Msgs Sent                         0             0
Local Msgs Recv'd                       0         16191
Distr Msgs Recv'd                       0             0

11 rows selected.

将近100万的数据在6秒钟导入了,如果是5000万的数据大概需要6分钟左右的时间,来简单验证一下
做一个大的数据插入。大概用了7分钟的时间,速度还是不错的。
SQL> insert /*+append parallel(big_table 8) */ into big_table select *from big_table_ext;
58303757 rows created.
Elapsed: 00:07:26.48
SQL> commit;
Commit complete.
Elapsed: 00:00:01.92

SQL> select * from v$pq_sesstat;
STATISTIC                      LAST_QUERY SESSION_TOTAL
------------------------------ ---------- -------------
Queries Parallelized                    0             0
DML Parallelized                        1             2
DDL Parallelized                        0             0
DFO Trees                               1             2
Server Threads                         16             0
Allocation Height                       8             0
Allocation Width                        1             0
Local Msgs Sent                    994995       1011186
Distr Msgs Sent                         0             0
Local Msgs Recv'd                  994995       1011186
Distr Msgs Recv'd                       0             0

11 rows selected.

在数据导入的过程中,启用了相应的并行进程。
26388 testdbn  15   0 11.5g 1.4g 1.1g S 38.3  0.4   2:41.80 ora_p012_TESTDB                                                                               
26394 testdbn  15   0 11.5g 1.4g 1.1g S 38.3  0.4   2:40.87 ora_p015_TESTDB                                                                               
26380 testdbn  15   0 11.5g 1.4g 1.2g S 37.6  0.4   3:50.61 ora_p008_TESTDB                                                                               
26390 testdbn  15   0 11.5g 1.4g 1.1g S 37.6  0.4   2:44.64 ora_p013_TESTDB                                                                               
26392 testdbn  15   0 11.5g 1.4g 1.1g S 37.3  0.4   2:43.63 ora_p014_TESTDB                                                                               
26382 testdbn  15   0 11.5g 1.4g 1.1g S 37.0  0.4   2:43.43 ora_p009_TESTDB                                                                               
 7080 testdbn  16   0 11.3g  68m  28m S  9.7  0.0   2:38.05 ora_arc2_TESTDB                                                                               
 4101 testdbn  15   0 11.2g 6.1g 6.1g S  6.1  1.7  10:54.46 ora_dbw1_TESTDB                                                                               
 4105 testdbn  15   0 11.2g 6.1g 6.1g S  6.1  1.7  11:27.73 ora_dbw3_TESTDB                                                                               
 4099 testdbn  15   0 11.2g 6.1g 6.1g R  5.8  1.7  11:49.40 ora_dbw0_TESTDB                                                                               
 4103 testdbn  15   0 11.2g 6.1g 6.1g S  4.8  1.7  10:47.55 ora_dbw2_TESTDB

所以在cpu资源充足的情况下,启用并行也是一个不错的选择。

时间: 2024-09-21 04:07:01

巧用parallel极速提升数据加载速度的相关文章

如何通过预加载器提升网页加载速度

预加载器(Pre-loader)可以说是提高浏览器性能最重要的举措.Mozilla 官方发布数据,通过预加载器技术网页的加载性能提升了19%,Chrome测试了 Alexa 排名前2000名网站,性能有20%的提升. 它并不是一门新技术,有人认为只有 Chrome 才具备这个功能.也有人认为它是有史以来提升浏览器性能最有效的方法.如果你第一次接触预加载器,也许心中已经有了无数个问号.什么是预加载器?它是如何提升浏览器性能的? 首先需要了解浏览器是如何加载网页的 一个网页的加载依赖于脚本文件.CS

提升网页加载速度和体验 谈图片优化的方法

在网站优化中,如果图片优化得好,不但可以提高页面的加载速度,提升网站的用户体验,而且还可以通过图片优化来节省网站的带宽.那么作为页面构建工程师应该采用什么方法来优化图片,既能保证UI的还原度,又使图片最精简呢?下面我就个人经验,来简单介绍一下图片优化的方法,首先我们了解一些图片方面的知识: 1. 矢量图与位图. 矢量图:缩放.旋转不失真的图像格式,不管你离多近去看都看不到图形的最小单位.存储的文件较小,但是很难表现色彩层次丰富的逼真图像效果.你可以理解成完美的圆型.抛物线等形状. 位图:又叫栅格

浅谈提升站点加载速度的三个简单而有效的方法

中介交易 SEO诊断 淘宝客 云主机 技术大厅 随着web技术的不断发展,尤其是自从搜索引擎把用户的友好体验列入到其搜索排名的关键因素之后,笔者觉得现今web的整体速度有了很明显的上升,尤其是在电信联通等网络提供商宣布全面提速后,站点的加载速度也就跟上来了,而站点的速度是我们留住用户的根本.那么今天笔者与大家分享的几个优化站点速度的心得,希望对各位站长在改进站点速度上能有所帮助! 一:最大限度的精简站点的脚本和CSS样式文件. 我们想要从站点本身优化速度的话,精简网站的html代码是必须做好的,

百度统计网站速度诊断,提升网页加载速度

一个网站上网页的加载速度,是用户体验的一个重要指标,是网站留给访客的第一印象.据国外研究显示,网站打开速度一旦超过4秒,就开始流失访客,当然也流失后续的流量.点击.转化等. 更快的网站速度不仅能改善用户体验,还能降低运营成本,对网站质量有整体的提升.所以,对于站长来讲,重视并不断优化自己http://www.aliyun.com/zixun/aggregation/18434.html">网站页面的打开速度是一件非常重要的工作. 既然网站速度这么重要,您可以通过何种方式关注或改善您网站的速

提高数据加载速度的常用方法

数据加载是数据库应用开发和测试中经常遇到的需求场景.如果要加载的数据量很大,加载的性能往往会成为瓶颈.最近又遇到了一个典型的数据加载场景,顺手总结一下相关的经验. 综合来看,提高加载速度的办法主要有: 1 优化表结构和定义 1.     表定义中避免采用操作代价较高的数据类型,例如在允许的情况下用 INTEGER 或 DOUBLE 代替 DECIMAL. 2.     延迟进行约束或完整性检查,例如在数据加载之后再创建索引和外码约束等. 3.     针对性的做一些物理参数调优,例如调整数据库页

【软件周刊第 32 期】Ubuntu 最新构建版启用 GNOME;Android 端 Chrome 59 提升页面加载速度

在最新发布的 Ubuntu 17.10 每日构建版中,Unity 桌面环境已消失,GNOME 已经正式成为即将推出的Ubuntu 17.10(Artful Aardvark)版本的默认桌面环境. 据悉,Ubuntu 17.10 将在 9 月 28 日发布 Final Beta 版本,这时候才会基本确定下来所有的内容,10 月 19 日 Ubuntu 17.10(Artful Aardvark)将正式发布. Android O 开发者预览版 Beta3 发布:包含最终 API 谷歌为参与 Andr

用 Flask 来写个轻博客 (28) — 使用 Flask-Assets 压缩 CSS/JS 提升网页加载速度

目录 目录 前文列表 扩展阅读 Flask-Assets 将 Flask-Assets 应用到项目中 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 Flask 来写个轻博客 (3) - (M)VC_连接 MySQL 和 SQLAlchemy 用 Flask 来写个轻博客 (4) - (M)VC_创建数据模型和表 用 Flask 来写个轻博客 (5) - (M)VC_SQLAlchemy 的 CRUD 详解 用

优化Jquery,提升网页加载速度_jquery

总是从ID选择器开始继承 在class前使用tag 将jquery对象缓存起来 掌握强大的链式操作 使用子查询 对直接的DOM操作进行限制 冒泡 消除无效查询 推迟到 $(window).load 压缩js 全面掌握jquery库 1. 总是从ID选择器开始继承 在jquery中最快的选择器是ID选择器. 因为它直接来自于Javascript的getElementById()方法. 复制代码 代码如下: <div id="content"><form method=&

Chrome 采用新压缩算法,提升加载速度/降低流量消耗

谷歌Chrome浏览器很快就会提升网页加载速度并且降低数据流量消耗,这要归功于公司引进的Brotli压缩算法.Brotli压缩算法始于去年九月.谷歌声称和使用已经达到3年时间的Zopfli算法相比,它可以将数据压缩率继续提升26%,谷歌表示,Brotli还可以帮助降低移动设备的电池使用量,达到省电目的. 据谷歌表示,Brotli是一个全新的数据格式,在包装中容纳更多数据,而解压缩速度和其他算法大致相同.如果你希望现在就用上Brotli压缩算法,那么可以下载Chrome Canary版(谷歌用于测