Я недавно начал использовать RODBC для подключения к PostgreSQL как Я не смог заставить RPostgreSQL скомпилировать и запустить в Windows x64 . Я обнаружил, что производительность чтения между двумя пакетами одинакова, но производительность записи - нет. Например, используя RODBC (где z - это кадр данных строки ~ 6.1M):
library(RODBC)
con <- odbcConnect("PostgreSQL84")
#autoCommit=FALSE seems to speed things up
odbcSetAutoCommit(con, autoCommit = FALSE)
system.time(sqlSave(con, z, "ERASE111", fast = TRUE))
user system elapsed
275.34 369.86 1979.59
odbcEndTran(con, commit = TRUE)
odbcCloseAll()
Принимая во внимание, что для того же фрейма данных ~ 6.1M строки с использованием RPostgreSQL (под 32-битным):
library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname="gisdb", user="postgres", password="...")
system.time(dbWriteTable(con, "ERASE222", z))
user system elapsed
467.57 56.62 668.29
dbDisconnect(con)
Итак, в этом тесте RPostgreSQL примерно в 3 раза быстрее RODBC при написании таблиц. Это соотношение производительности остается более или менее постоянным независимо от количества строк в кадре данных (но количество столбцов оказывает гораздо меньшее влияние). Я заметил, что RPostgreSQL использует что-то вроде COPY <table> FROM STDIN
, в то время как RODBC выдает кучу INSERT INTO <table> (columns...) VALUES (...)
запросов. Я также заметил, что RODBC, кажется, выбирает int8 для целых чисел, тогда как RPostgreSQL выбирает int4 там, где это необходимо.
Мне нужно часто делать такого рода копии данных, поэтому я бы очень искренне был бы благодарен за любые советы по ускорению RODBC. Например, это просто присуще ODBC, или я не правильно его называю?