Таблица базы данных фильтра 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 ответа
Обратите внимание, конечно, поможет ли это, но несколько предложений:
- Найдите другие критерии для фильтрации. Например, если
my_values$FIELD
является последовательным или список значений может быть выведен из некоторых других столбцов, вы можете обратиться за помощью кbetween
фильтр:filter(between(FIELD, a, b))
? - Разделяй и властвуй. Трещина
my_values
на небольшие партии, сделайте запросы для каждой партии, затем объедините результаты. Это может занять некоторое время, но должно быть стабильным и стоить ожидания.
Глядя на ваши ограничения, я подхожу к этому подобно тому, как предложил Polor Beer, но я бы отправлял одну команду дб на значение, используя purrr::map
а затем использовать dplyr::bindrows()
в конце. Таким образом, у вас будет хороший конвейерный код, который будет адаптироваться, если ваш список изменится. Не идеально, но если вы не хотите писать переменную таблицы SQL вручную, не уверены в каких-либо других решениях.