我最近開始使用RODBC連接到PostgreSQL作爲I couldn't get RPostgreSQL to compile and run in Windows x64。我發現這兩個軟件包的讀取性能是相似的,但寫入性能不是。例如,使用RODBC(其中z是一〜6.1M行數據幀):改進RODBC-Postgres的寫入性能
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同一〜6.1M行數據幀(在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在編寫表格時的速度是RODBC的3倍。無論數據幀中的行數是多少(但列數的影響要小得多),此性能比似乎保持或多或少不變。我注意到RPostgreSQL使用類似COPY <table> FROM STDIN
的東西,而RODBC發出一堆INSERT INTO <table> (columns...) VALUES (...)
查詢。我還注意到RODBC似乎選擇int8作爲整數,而RPostgreSQL在適當的情況下選擇int4。
我需要經常做這種數據幀拷貝,所以我會非常真誠感謝任何有關加速RODBC的建議。例如,這是ODBC固有的,還是我沒有正確調用它?
在我有限的經驗中,將大量數據填充到Postgres中,從'INSERT INTO'切換到'COPY'是可接受性能的必要條件。 – Sharpie 2011-04-19 03:53:32