【发布时间】:2018-04-08 13:29:15
【问题描述】:
假设我有一个到名为con 的外部数据库的连接。
我想使用dplyr 重现此查询
SELECT var1, var2, var3 from myTable LIMIT 10
我试过了
qry <- tbl(con, "myTable") %>%
select(var1) %>%
filter(between(row_number(), 1, 10)
但它没有给出想要的结果,而且它产生的查询比我所追求的要慢得多。
它产生的查询是
SELECT "var1",
FROM SELECT "var1", row_number() OVER () AS "zzz25"
FROM SELECT "var1" AS "var1"
FROM myTable "yhydrqlhho") "zsdfunxidf"
WHERE zzz25 BETWEEN 1.0 AND 10.0)
当我将此查询发送到数据库时,它会运行很长时间。当我发送
SELECT var1 from myTable limit 10
结果立即返回。
【问题讨论】:
-
在使用 dplyr 编辑数据之前,为什么要使用 dplyr 而不是使用 RODBC 之类的东西?
-
你的SQL查询有问题,因为没有
ORDER BY子句。说LIMIT 10没有排序是没有意义的。 -
dplyr(好吧,真的是dbplyr)通常会生成次优的 SQL 代码 b/c 它没有完整的查询分析引擎或其他真正的 SQL 和后端数据库启发式来做到这一点.它的主要目标是使用数据库,就像使用普通的dplyr处理内部 R 数据帧一样。您实际上可以执行tbl(con, "SQL STATEMENT")来使用返回表dplyr可以使用的优化查询。 -
出于好奇,在 dplyr 代码中交换
filter和select语句会导致加速吗? -
@hrbrmstr 很有趣。谢谢你的提示。 dplyr 创建的 SQL 在 98% 的情况下运行良好,但我无法使用 dplyr 有效地获取大表的前 10 行。看起来这很容易。
标签: sql r dplyr tidyverse dbplyr