Как показывают ссылки @ A.Suliman, это, скорее всего, связано с большим количеством значений в вашем предложении IN. Вот несколько решений, которые можно попробовать:
Пакетная обработка
Я фанат использования модуля для пакетного процесса. Предполагается, что значения идентификаторов, через которые вы выполняете пакетную обработку, равны цифрам c:
num_batches = 100
output_list = list()
for(i in 1:num_batches){
this_subset = filter(dataframe, ID %% num_batches == (i-1))
# subsequent processing using this_subset
output_list[i] = results_from_subsetting
}
output = data.table::rbindlist(output_list)
В вашем случае выглядит, как идентификатор принимает форму XX-123
(два символа, дефис, за которым следуют некоторые цифры) , Вы можете преобразовать это в число, используя: just_number_part = substr(ID, 4, nchar(ID))
.
Запись во временный файл
Если бы вы записали dataframe
из R в sql, вам не понадобился бы такой большой IN-предложение и может использовать вместо этого соединение. В пакет dbplyr
входит функция copy_to
, которую можно использовать для записи временных таблиц в базу данных.
Это будет выглядеть примерно так:
library(RMySQL)
library(dbplyr)
conn<- connection
copy_to(conn, dataframe, name = "my_table_name") # copy local table to mysql
query<-paste0("SELECT c.ID,e.Parameters, d.status
FROM Table1 c
INNER JOIN my_table_name a ON a.ID = c.ID # replace IN-clause with inner join
left outer join Table2 d ON d.seq_id=c.ID
LEFT outer JOIN Table3 e ON e.role_id=d.role
WHERE e.Parameters in
('Section1',
'Section2','Section3',
'Section4');")
res1 <- dbGetQuery(conn,query)
Для справки я рекомендую документация о состоянии дел . Вы также можете найти этот вопрос при написании с использованием copy_to
полезным для отладки.
Увеличение задержки времени ожидания
Когда в предложении IN много значений запрос становится намного медленнее, поскольку IN-предложение по существу транслируется в последовательность операторов OR.
Согласно этой ссылке вы можете изменить параметры времени ожидания для MySQL следующим образом:
- Отредактируйте ваш my.cnf (MySQL файл конфигурации)
- Добавьте конфигурацию тайм-аута и настройте ее в соответствии с вашим сервером.
wait_timeout = 28800
interactive_timeout = 28800
- Перезагрузка MySQL