как выполнить пакетную вставку с использованием пакета R odb c function dbWriteTable () - PullRequest
1 голос
/ 29 мая 2020

Я использую 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 () для записи данных сначала во временную таблицу, а затем вставляю данные из временной таблицы. Таким образом, триггер будет срабатывать только один раз, а скорость вставки будет очень высокой, но я все же хочу знать, есть ли более простой способ сделать это без использования временной таблицы.

Спасибо.

...