Таблица базы данных фильтра dplyr с большим количеством совпадений

Я работаю с dplyr и dbplyr пакет для взаимодействия с моей базой данных. У меня есть таблица с миллионами записей. У меня также есть список значений, которые соответствуют ключу в той же таблице, которую я хочу отфильтровать. Обычно я бы сделал что-то подобное для фильтрации таблицы.

library(ROracle)

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

# df with values - my_values

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

Однако это my_values Объект содержит более 500 тыс. записей (поэтому я не предоставляю здесь фактические данные). Это явно не эффективно, когда они в основном будут помещены в IN заявление (это по существу висит). Обычно, если бы я писал SQL, я бы создал временную таблицу и написал бы WHERE EXISTS пункт. Но в этом случае у меня нет прав на запись.

Как я могу сделать этот запрос более эффективным в R?

2 ответа

Обратите внимание, конечно, поможет ли это, но несколько предложений:

  1. Найдите другие критерии для фильтрации. Например, если my_values$FIELD является последовательным или список значений может быть выведен из некоторых других столбцов, вы можете обратиться за помощью к between фильтр: filter(between(FIELD, a, b))?
  2. Разделяй и властвуй. Трещина my_values на небольшие партии, сделайте запросы для каждой партии, затем объедините результаты. Это может занять некоторое время, но должно быть стабильным и стоить ожидания.

Глядя на ваши ограничения, я подхожу к этому подобно тому, как предложил Polor Beer, но я бы отправлял одну команду дб на значение, используя purrr::map а затем использовать dplyr::bindrows() в конце. Таким образом, у вас будет хороший конвейерный код, который будет адаптироваться, если ваш список изменится. Не идеально, но если вы не хотите писать переменную таблицы SQL вручную, не уверены в каких-либо других решениях.

Другие вопросы по тегам