DB2 load导入大数据量如何优化?

最近在测试db2数据库上线导入数据的性能问题,使用导入一个大概1亿多的表,启动任务好几个小时也没动静,内存64G几乎占完了,这个怎么优化啊,网上查可以使用SAVECOUNT优化,这个savecount设置多大合适啊?还有什么其他的优化策略吗?

参与15

2同行回答

y18511664518y18511664518  技术总监 , 长城超云
一亿多数据还用这种方法?如果必须使用这种方法,那就把导入的数据切分,分批导入。影响 LOAD 性能的选项LOAD 工具与其他数据移动工具比较起来的一大优势就是提供卓越的性能,这主要是由于 LOAD 对数据的加载时采取数据页级别的处理,这绕过了数据库管理系统的多个处理层次,因此可...显示全部

一亿多数据还用这种方法?如果必须使用这种方法,那就把导入的数据切分,分批导入。
影响 LOAD 性能的选项
LOAD 工具与其他数据移动工具比较起来的一大优势就是提供卓越的性能,这主要是由于 LOAD 对数据的加载时采取数据页级别的处理,这绕过了数据库管理系统的多个处理层次,因此可以极大的提高性能。除了 LOAD 工具本身的这一特点之外,我们还可以通过合理的设置 LOAD 的一些选项来进一步提高其性能。下面列出一些影响 LOAD 性能的选项及其合理设置的建议。
CPU_PARALLELISM n
此选项用于指定一个 LOAD 同时使用 n 个 CPU 来并发的处理 LOAD,在 LOAD 处理的数据量较大并且操作系统的负载不高的情况下,可以通过此参数指定多个 CPU 并发的执行构建表过程中的解析、转换、格式化等内容来提高效率。如果同时启动了多个 LOAD 工具要注意所有 LOAD 工具指定的此参数最好不要超过操作系统中逻辑 CPU 的总数(在此指定的 CPU 是 LCPU- 即逻辑 CPU)。
此选项不设置,则 DB2 会根据当前操作系统中 CPU 的数量自动的分配 CPU 数量。
DATA BUFFER buffersize
此选项用于指定 LOAD 工具能够使用的数据缓存的最大值,单位是 4k 。我们可以想象,在处理的数据量很大,且在不超过操作系统空闲物理内存的情况下,我们为 LOAD 分配越多的数据缓存那么 LOAD 的性能将会越好。但是此值设置受到数据库的参数 UTIL_HEAP_SZ 限制。 由于使用 UTIL_HEAP_SZ 的工具有多个,所以为某个 LOAD 分配的数据缓存一般建议不要超过 UTIL_HEAP_SZ 的 50%,在实际设置时,最好根据UTIL_HEAP_SZ 的实际情况来确定,这可以通过观察数据库快照中工具堆使用的大小和高水位大小来判断。
另外,此选项并非单纯的设置的越大越好,因为在数据缓存设置的最够大以后即使再增加其大小也不会有利于性能的提升,因为性能的瓶颈已经不在是缓存了。所以需要在实际生产中做多次的测试以找到一个最适合的值。
DISK_PARALLELISM n
此选项用于指定 LOAD 工具可以利用向表空间中多个容器执行并发 I/O 的能力来提高性能。根据表空间中容器的数量做适当设置即可。
Modified by ANYORDER
此文件修饰符,可以使用输入文件中预设好的排序结果来提高性能。如果输入的文件来自于 export 工具中使用一定排序谓词到处的数据,那么性能会得到较大提升(可以提升几倍到几十倍)。且此文件修饰符可以用于各种输入的文件格式。
Modified by FASTPARSE
此文件修饰符通过降低对输入数据的检查来提升性能,如果输入的数据与目标表的结构、类型上并无差别,那么可以通过设置此选项来提升性能。此文件修饰符只能用于 ASC 或 DEL 格式的文件。
Modified by NOROWWARNINGS
如果预期在 LOAD 过程会有大量的 warning 出现,那么可以使用此文件修饰符来提升性能。
SAVECOUNT
此选项可以降低 LOAD 在设置一致性恢复点上面的负载,在处理大数据量的情况下可以使用此选项来提升性能,根据处理数据量的情况来合理的设置此值。如需要加载的数据为 1000 万行,那么可以将此值设置为 10000 。此文件修饰符不能与 anrorder 文件修饰符同时使用。
USER tablespace
当需要 LOAD 的表中存在大量索引需要构建时,且表或索引本身所在的表空间不不是很大的情况下,使用此选项制定一个系统临时表空间,来提高其数据构建的性能。
使用游标(cursor)来提高 LOAD 性能
LOAD 工具在加载数据的时候,输入的数据除了可以是 ixf、asc 和 del 类型的文件之外,还可以是游标(curosr)。如果需要将一个表中的数据保存到另外一张表中,且对应的列的类型是一致的,那么我们就可以使用游标的方式来实现数据的移动。游标方式之所以能提高数据加载的效率是因为数据不需要以文件的方式保存到磁盘上,而是直接从源数据表到达目标数据表中,这样就可以节省了两次 I/O 过程(导出的数据以文件保存到磁盘的过程和加载数据时从磁盘上读取数据文件的过程),从而大大提高数据处理的效率。

收起
金融其它 · 2017-07-28
DB-TrendSetterDB-TrendSetter  数据库架构师 , 公司
一亿条数据,对于LOAD来说算不上大任务,我觉得根源是你的数据库存在性能问题,建议重点排查下,表空间所在的存储。显示全部

一亿条数据,对于LOAD来说算不上大任务,我觉得根源是你的数据库存在性能问题,建议重点排查下,表空间所在的存储。

收起
电信运营商 · 2017-07-28

提问者

大祁
数据库开发工程师上海安硕

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2017-07-27
  • 关注会员:3 人
  • 问题浏览:3842
  • 最近回答:2017-07-28
  • X社区推广