在连接到PostgreSQL时,我对dbplyr
的性能有一个特殊的问题。
已经使用不同的程序包(RPostgres
,RPostreSQL
和odbc
)进行了测试,后者总结了性能问题。
这是dbplyr
特有的,与dbGetQuery
无关。
这是我使用的步骤
odbc_driver <- if (.Platform$OS.type == "windows") {
"PostgreSQL Unicode(x64)"
} else {
"PostgreSQL Unicode"
}
con <- DBI::dbConnect(
odbc::odbc(),
Driver = odbc_driver,
Server = pikachu_ip,
Database = pikachu_db,
UID = pikachu_user,
PWD = pikachu_password,
Port = 5432
)
这很慢,大约需要5分钟,并且show_sql()
会显示与第3步相同的查询。
library(dplyr)
library(dbplyr)
tbl(con, in_schema("pikachu", "stock")) %>%
filter(month == 201305) %>%
group_by(product) %>%
count() %>%
collect()
这是快速的,只需不到2秒。我还检查了它是否使用了索引(已通过EXPLAIN ANALYZE
测试)。
odbc::dbGetQuery(con,
'SELECT "product", COUNT(*) AS "n"
FROM pikachu.stock
WHERE ("month" = 201305)
GROUP BY "product"'
)