【发布时间】:2020-04-02 09:36:11
【问题描述】:
我们正在尝试使用 RODBC 连接和 sqlQuery 函数将数据帧插入 Oracle 数据库。我们也在使用mclapply函数来实现并行。插入性能非常慢,因为插入 360 万条记录需要 6 个小时。数据库端没有创建日志。
请告诉我们如何提高 R 中的插入性能,如果需要更多信息,请告诉我们。
Target1Conn<-odbcConnect('TARGET_DATABASE','USERNAME','PASSWORD')
if(nrow(InputData)>0)
{
sqls<-sprintf(paste0('insert into ',
outputTableName,'(col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15)
values(%s)'),
apply(InputData, 1, function(i) paste(i, collapse=",")))
}
mclapply(sqls, function(s) {
sqlQuery(Target1Conn, s)
},mc.cores=4)
【问题讨论】:
-
您是否尝试过
sqlSave而不是循环遍历行:sqlSave(Target1Conn, InputData, outputTableName, fast=TRUE, append=TRUE, rownames=FALSE)? -
嗨 Parfait,我们已经尝试过 sqlSave,但它正在创建表默认数据类型,而不是指定数据类型。更重要的是,加载数据需要同样的时间。
-
你能试试遵循 R 的 DBI 标准(包括 RJDBC、ROracle、RMySQL、RSQLite)的
odbc包并使用dbWriteTable吗? -
我们正面临 odbc 包的一些问题并试图解决它。问题解决后,我们将尝试使用 odbc 实现并测试性能。
标签: r database oracle performance rodbc