r语言 - dplyr 筛选具有大量匹配项的数据库表



我正在使用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对象包含超过 500K 个条目(因此我在这里不提供实际数据(。 当它们基本上被放在一个IN语句中时,这显然是没有效率的(它基本上挂起了(。 通常,如果我在编写 SQL,我会创建一个临时表并编写一个WHERE EXISTS子句。 但在这种情况下,我没有写入权限。

如何在 R 中提高此查询的效率?

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

  1. 查找其他筛选条件。例如,如果my_values$FIELD是连续的,或者值列表可以通过其他列推断,则可以向between筛选器寻求帮助:filter(between(FIELD, a, b))
  2. 分而治之。将my_values拆分为小批量,对每个批次进行查询,然后合并结果。这可能需要一段时间,但应该是稳定的,值得等待。

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

最新更新