【问题标题】:Create the SQL query "SELECT * FROM myTable LIMIT 10" using dplyr使用 dplyr 创建 SQL 查询“SELECT * FROM myTable LIMIT 10”
【发布时间】: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 代码中交换 filterselect 语句会导致加速吗?
  • @hrbrmstr 很有趣。谢谢你的提示。 dplyr 创建的 SQL 在 98% 的情况下运行良好,但我无法使用 dplyr 有效地获取大表的前 10 行。看起来这很容易。

标签: sql r dplyr tidyverse dbplyr


【解决方案1】:

你可以试试head(10),它会在Postgres上生成正确的sql查询:

tbl(con, 'my_table') %>% select(var1, var2) %>% head(6) %>% explain()
# here con is a PostgreSQL connection

#<SQL>
#SELECT "var1" AS "var1", "var2" AS "var2"
#FROM "my_table"
#LIMIT 6

【讨论】:

    【解决方案2】:

    如果您从查询中获取实际数据,而不仅仅是重新创建 SQL 查询,那么指定 collect(n=10) 将给出与 @Psidom 的答案相同的输出。

    tbl(con, 'my_table') %>% select(var1, var2) %>% collect(n=10)
    
    # A tibble: 10 x 2
       var1  var2 
       <chr>       <dbl>   
     1 text1            87.8     
     2 text2            99.6    
     3 text3           100       
     4 text4            91.9     
     5 text5            76.8    
     6 text6            77.8    
     7 text7            77.2    
     8 text8            97.2  
     9 text9            97.5
    10 text10            80.4
    

    注意collect() 中的默认值为n = 1e+05,因此如果您的数据(过滤后)包含更多行,则需要指定collect(n=Inf) 来检索它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 2018-10-23
      相关资源
      最近更新 更多