RPostgreSQL をWindows x64 でコンパイルして実行することができなかったため、最近 RODBC を使用して PostgreSQL に接続し始めました。読み取りパフォーマンスは 2 つのパッケージ間で類似していることがわかりましたが、書き込みパフォーマンスはそうではありません。たとえば、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()
一方、RPostgreSQL (32 ビット未満) を使用した同じ ~6.1M 行のデータフレームの場合:
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 はテーブルの書き込みにおいて RODBC の約 3 倍の速さです。このパフォーマンス比は、データフレーム内の行数に関係なく、ほぼ一定に保たれているようです (ただし、列数の影響ははるかに少なくなります)。COPY <table> FROM STDIN
RODBC が一連のクエリを発行している間、RPostgreSQLは次のようなものを使用していることに気付きましたINSERT INTO <table> (columns...) VALUES (...)
。また、RODBC は整数に int8 を選択しているように見えますが、RPostgreSQL は必要に応じて int4 を選択しているようです。
この種のデータフレームのコピーを頻繁に行う必要があるため、RODBC の高速化に関するアドバイスをいただければ幸いです。たとえば、これは ODBC に固有のものですか、それとも正しく呼び出していませんか?