一、fastloader各场景使用总结
1、目标表为非分区表,导入数据量大于存量数据量5%,建议设置index_option=1;导入数据量小于存量数据量5%,建议设置index_option=3。
2、目标表为分区表,导入数据经过确认落在一个分区,建议ctl中设置into table 参数为分区对应的子表,可以有效提升效率。
3、目标表为分区表,导入数据不落在一个分区,同时导入数据量较大(文件大于100G),需要现场测试index_option不同设置的实际效果。
4、大数据量(大于100G)、大并发(并发10个fastloader进程以上)、索引数量较多(目标表索引超过10个)的场景下,如果测试效果不佳,可以考虑使用fastloader进中间表再通过编写程序逐个分区中转的方式完成。
二、详细分析
2.1 fastloader过程中主要负载分析
Fastloader导入过程中主要工作负载如下:
1、读取数据文件的磁盘read
2、写入目标表的磁盘write
3、写入redo log的磁盘或网络write
4、写入归档的磁盘或网络write
5、更新目标表索引的索引定位等操作
6、重建目标表索引的排序等操作
7、并发情况下其他争抢
总结以上负载,主要集中在磁盘IO、网络IO、排序几个方向,因此Fastloader不能达到性能要求的情况下,应主要关注以上几个方面是否达到了主机IO、内存、网络等性能瓶颈。
在高并发、大数量等场景下,出现性能异常下降的情况,应考虑使用中间表过度的方法将复杂任务进行拆分,避免高并发、大数据量、分区表、索引这几个场景同时出现。
例如,确认导入的分区是空segment的情况下,可以考虑如下方案:1、建立相同结构的非分区表 2、fastloader进非分区表 3、在非分区表上建立和目标表相同的索引4、exchange到目标表的方式。这种方案可以绕过“分区表”“索引”两个容易造成性能问题的点。
再比如,如果导入的数据分散在多个分区上,每个分区的数据量相对较小,可以考虑建立相同结构的分区表,fastloader进这个分区表,再逐个分区insert进行数据合并,这样看似多进行一次io,但是过程可控,retry单位小、性能发挥稳定。分区表的索引绝大部分是LOCAL索引(分区表上出现全局索引可以考虑是架构设计的错误),逐个分区处理相当于只需要维护一个“小索引”,排序规模扩大时,cost会出现暴增的现象,“排序规模-cost”曲线随着排序规模的变大,相交点的切线斜率会变大,不是一条直线。
这种将复杂任务分解成多个步骤的方式是在银行、金融、通信、电力等数据库传统行业的核心系统OLAP业务的重要手段,优点是:
1、单个步骤动作简单(对数据库来说)不易出现问题
2、过程可控,根据负载人工调整不同步骤的并发实现非常简单
3、某个步骤出现异常只需要重做这一个步骤,减小任务风险
4、可以灵活规避工具、组件、模块的固有缺陷
2.2目标表为非分区表导入过程分析
测试fastloader导入数据量5.2G,11个字段,一个主键,一个单列索引
index_option 平均导入时长(秒) 平均生成归档日志量(GB)
1 180 8
2 150 8
3 250 24
经过测试非分区表情况下index option设置为1、2都可以。非分区表情况下基本比较稳定,只需要关注2.1小节中主要负载的:“5、更新目标表索引的索引定位等操作6、重建目标表索引的排序等操作7、并发情况下其他争抢”这三项,根据现场情况适当增大sort_buf_global_size。
2.3目标表为分区表导入过程分析
指定into table 为目标分区表的情况:
index_option 平均导入时长(秒) 平均生成归档日志量(GB)
1 280 40
2 1000以上 100以上
3 240 40
由于目标表内有存量数据,Index_option=2时会将整个索引重建,造成日志量和执行时间上涨,因此在分区表且存量数据较多的情况下,不建议使用Index_option=2。
又可以分为三种子情况,需要根据现场情况制定适合的方案:
情况一:如果确认导入的数据是落到某一个分区的,可以在ctl文件中设置into table为这个分区的子表名:
性能如下:
index_option 平均导入时长(秒) 平均生成归档日志量(GB)
2 170 8.5
指定目标表为分区的子表时,只需要处理这个子表的索引,所以生成的归档日志量明显减小,速度提升。
情况二:如果导入数据落入目标表的多个分区且分区内有存量数据,可以考虑建立一个和目标表结构完全一致的空分区表进行导入,然后逐个分区使用insert或merge进行合并。这样在导入过程中不需要fastloader维护索引的一致性,相当于index option设置不影响导入。
情况三:如果导入数据落入目标表的多个分区且分区为空,可以考虑考虑建立一个和目标表结构完全一致的空分区表进行导入,然后逐个分区使用exchange的方式进行交换,这样在导入过程中不需要fastloader维护索引的一致性,相当于index option设置不影响导入。索引维护可以考虑通过编写存储过程固化到流程中。
文章
阅读量
获赞