4

我正在使用dplyrdbplyr与我的数据库交互的包。我有一张包含数百万条记录的表。我还有一个值列表,这些值对应于我希望过滤的同一个表中的键。通常我会做这样的事情来过滤表格。

library(ROracle)

# connect info omitted
con <- dbConnect(...)

# df with values - my_values

con %>% tbl('MY_TABLE') %>% filter(FIELD %in% my_values$FIELD)

但是,该my_values对象包含超过 50 万个条目(因此我在这里不提供实际数据)。当它们基本上被放入一个IN语句(它基本上挂起)时,这显然是没有效率的。通常,如果我在编写 SQL,我会创建一个临时表并编写一个WHERE EXISTS子句。但在这种情况下,我没有写权限。

如何使此查询在 R 中更有效?

4

2 回答 2

1

请注意确定这是否会有所帮助,但有一些建议:

  1. 查找其他过滤条件。例如,如果my_values$FIELD是连续的或者值列表可以由其他一些列推断,您可以向between过滤器寻求帮助:filter(between(FIELD, a, b))?
  2. 分而治之。拆分my_values成小批次,对每个批次进行查询,然后合并结果。这可能需要一段时间,但应该是稳定的,值得等待。
于 2017-08-24T18:31:24.627 回答
0

查看您的限制,我会以类似于 Polor Beer 建议的方式来处理它,但我会使用每个值发送一个 db 命令purrr::map,然后dplyr::bindrows()在最后使用。这样,您将拥有一个很好的管道代码,如果您的列表发生更改,它将适应。不理想,但除非您愿意手动编写 SQL 表变量,否则不确定任何其他解决方案。

于 2017-08-29T00:07:34.457 回答