Я использую dbWriteTable () для сохранения кадров данных в R в sql базе данных сервера в течение некоторого времени. Обычно я делаю следующее:
library(odbc)
con = odbc::dbConnect(odbc(),
Driver = "SQL Server",
Server = server,
Database = "research",
Trusted_Connection = "True")
table = Id(schema = "schemaName", table = "tableName")
savingResult <- dbWriteTable(con, table, dataframeToSave,append=TRUE,overwrite = FALSE,batch_rows=nrow(dataframeToSave))
Он хорошо работает. До недавнего времени я использовал тот же код для сохранения данных в представлении в базе данных. У этого представления есть триггер. Итак, когда вы вставляете в это представление. Триггер выполнит некоторые проверки и сохранит данные в соответствующие таблицы. В принципе, я могу рассматривать это представление как таблицу.
Когда я это делаю, сотрудники моей группы данных сказали мне, что я не выполняю пакетную вставку. Я вставляю данные построчно. Итак, если я вставляю фрейм данных с 1000 строками, триггер срабатывает 1000 раз. Это приводит к тому, что процесс сохранения становится очень медленным.
Я думал, что dbWriteTable () все время выполняет пакетную вставку. Я прочитал из inte rnet, потерянных сообщений, также упоминающих, что dbWriteTable () выполняет пакетную вставку. Сотрудники моей группы данных спросили меня, есть ли у этой функции параметр sth, аналогичный FIRE_TRIGGERS. Если да, это может решить проблему. Однако похоже, что dbWriteTable () не имеет параметров, подобных этому. Кто-нибудь может подтвердить, выполняет ли dbWriteTable () пакетную вставку? Если нет, есть ли способ сделать пакетную вставку?
Сейчас я работаю над этой проблемой, используя dbWriteTable () для записи данных сначала во временную таблицу, а затем вставляю данные из временной таблицы. Таким образом, триггер будет срабатывать только один раз, а скорость вставки будет очень высокой, но я все же хочу знать, есть ли более простой способ сделать это без использования временной таблицы.
Спасибо.