dbplyr绕过索引并运行顺序扫描

时间:2019-12-12 14:52:39

标签: r postgresql dplyr odbc

在连接到PostgreSQL时,我对dbplyr的性能有一个特殊的问题。

已经使用不同的程序包(RPostgresRPostreSQLodbc)进行了测试,后者总结了性能问题。

这是dbplyr特有的,与dbGetQuery无关。

这是我使用的步骤

步骤1:连接

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
)

步骤2:使用dbplyr运行查询

这很慢,大约需要5分钟,并且show_sql()会显示与第3步相同的查询。

library(dplyr)
library(dbplyr)

tbl(con, in_schema("pikachu", "stock")) %>% 
  filter(month == 201305) %>% 
  group_by(product) %>% 
  count() %>% 
  collect()

步骤3:使用dbGetQuery运行查询

这是快速的,只需不到2秒。我还检查了它是否使用了索引(已通过EXPLAIN ANALYZE测试)。

odbc::dbGetQuery(con,
  'SELECT "product", COUNT(*) AS "n"
  FROM pikachu.stock
  WHERE ("month" = 201305)
  GROUP BY "product"'
)

0 个答案:

没有答案