为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。 【DM版本】:8 【操作系统】:凝思99 【CPU】:Hygon 3350 【问题描述】*:每秒8万条数据,计划每30秒插一次达梦库,要如何保证插入时效率
“每秒8万条数据,计划每30秒插一次达梦库”,也就是每次要写入240W记录,如果都塞到一个表里,光这个表上的索引刷新的耗时估计就会是个非常耗时的过程了。 我有一个想法,可能略麻烦,你可以参考下。
一、库里大表创建为分区表,为每30秒的数据灌入操作设置一个批次字段(也可以使用导入数据时间为批次号),并以该批次字段创建分区 二、每30秒的这240W数据应该是外部系统生成的吧,那能否先将数据灌入到本地的一个过渡用的文本文件里。 三、每次写入数据前,先创建一个物理表(非分区表)作过渡表,与你的目标表同构,包括字段、索引、主键等都一致 四、利用dmfldr将外部文件的数据灌入到新建的物理表里,这个比insert快 五、数据灌入到过渡表后,利用分区交换方式,将过渡表与大表中对应的分区作交换,这个步骤还是非常快的
这个想法,主要是考虑以下几点: 一、240W记录,如果直接insert方式向大表写入,赶上IO有其他负载,很可能30秒也写不完。这样后续的30秒数据又过来了 二、如果库中大表不作分区,那表上的索引(这种汇聚表肯定会有索引,而且估计不止一两个)更新耗时会非常长 三、使用dmfldr向过渡表灌入数据,这样就算某个批次数据灌入耗时长,也不会影响其他批次,毕竟每次灌入操作都是独立进程 四、可以通过外部java或其他程序来实现并行处理,数据灌入到过渡表后作分区交换,反正哪批数据处理完就交换哪批,批次间影响小,主要就是灌入数据过程会产生IO写入负载,这个要实测评估 五、这个大表里,不要建全局索引,要不每次导入后再刷全局索引就费时费力了 六、每秒8W记录,一天下来就是69E记录啊,这量太大了,表空间容量、数据聚合啥的估计都是麻烦啊
这只是我一时的粗略想法,你再看看其他网友有没有好办法。
“每秒8万条数据,计划每30秒插一次达梦库”,也就是每次要写入240W记录,如果都塞到一个表里,光这个表上的索引刷新的耗时估计就会是个非常耗时的过程了。
我有一个想法,可能略麻烦,你可以参考下。
一、库里大表创建为分区表,为每30秒的数据灌入操作设置一个批次字段(也可以使用导入数据时间为批次号),并以该批次字段创建分区
二、每30秒的这240W数据应该是外部系统生成的吧,那能否先将数据灌入到本地的一个过渡用的文本文件里。
三、每次写入数据前,先创建一个物理表(非分区表)作过渡表,与你的目标表同构,包括字段、索引、主键等都一致
四、利用dmfldr将外部文件的数据灌入到新建的物理表里,这个比insert快
五、数据灌入到过渡表后,利用分区交换方式,将过渡表与大表中对应的分区作交换,这个步骤还是非常快的
这个想法,主要是考虑以下几点:
一、240W记录,如果直接insert方式向大表写入,赶上IO有其他负载,很可能30秒也写不完。这样后续的30秒数据又过来了
二、如果库中大表不作分区,那表上的索引(这种汇聚表肯定会有索引,而且估计不止一两个)更新耗时会非常长
三、使用dmfldr向过渡表灌入数据,这样就算某个批次数据灌入耗时长,也不会影响其他批次,毕竟每次灌入操作都是独立进程
四、可以通过外部java或其他程序来实现并行处理,数据灌入到过渡表后作分区交换,反正哪批数据处理完就交换哪批,批次间影响小,主要就是灌入数据过程会产生IO写入负载,这个要实测评估
五、这个大表里,不要建全局索引,要不每次导入后再刷全局索引就费时费力了
六、每秒8W记录,一天下来就是69E记录啊,这量太大了,表空间容量、数据聚合啥的估计都是麻烦啊
这只是我一时的粗略想法,你再看看其他网友有没有好办法。