dbwritetable из нескольких сеансов R studio в одну и ту же таблицу SQL одновременно - PullRequest
0 голосов
/ 12 сентября 2018

Я запустил 4 сеанса из RStudio и вижу 4 «R Studio R session» в диспетчере задач. Я подключаюсь к одной и той же таблице базы данных SQL в каждом сеансе и dbwritetable, используя то же имя DSN.

conn<-dbConnect(odbc::odbc(),"server",database="x_test")

dbWriteTable(conn,"x_testbl",export,overwrite=FALSE,append=TRUE)

Обратите внимание, что экспорт - это data.table, он имеет те же столбцы, что и таблица SQL, в которую производится запись, и каждая таблица "export" в сеансе будет относительно уникальной, но некоторые столбцы могут иметь одно и то же значение (естественно).

Я надеюсь выполнить несколько записей в каждой сессии одновременно. Каждый сеанс выполняет некоторые вычисления, а затем dbwritetable записывает data.table в таблицу SQL. Это может вызвать проблемы? Могу ли я что-нибудь сделать, чтобы не было проблем? Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Если вы тестировали свой код на той же версии SQL Server 2016 используя SQL Server Native Client 11.0 (у меня не установлен ваш драйвер) и отслеживал код SQL, выполненный на сервере.

Я использую набор данных iris:

dbWriteTable(con, "iris", iris, overwrite = FALSE, append = TRUE)

Пакет odbc в основном выдает эти команды (подготовленный оператор):

declare @p1 int
set @p1=9
exec sp_prepare @p1 output,N'@P1 float,@P2 float,@P3 float,@P4 float,@P5 varchar(255)',N'INSERT INTO "iris" ("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")
VALUES (@P1, @P2, @P3, @P4, @P5)',1
select @p1

exec sp_execute 9,5.0999999999999996,3.5,1.3999999999999999,0.20000000000000001,'setosa'
[... multiple inserts...]

exec sp_unprepare 9

Таким образом, нет риска параллельного выполнения вашего кода в нескольких сеансах, помимо обычного SQL Server, например, недетерминированного порядка вставки строк (что может привести к различным значениям автоматического ввода для одной и той же вставленной строки, если вы попытаетесь воспроизвести поведение ).

У вас также будет четыре открытых соединения (вообще никаких проблем).

Если ваша цель - производительность вставки, можно использовать разные методы массовой вставки SQL Server, но производительность dbWriteTable отличная (если вы используете актуальную версию).

Подробнее о «массовой загрузке» через пакет odbc см.

https://github.com/r-dbi/odbc/issues/34

Добавлено позже:

каждая таблица экспорта в сеансе будет относительно уникальной но некоторые столбцы могут иметь одинаковое значение (естественно).

Если ваша целевая таблица не имеет первичного ключа, это не проблема вставлять дублированные строки (пока вы не захотите повторно идентифицировать одиночные строки, но это проблема чистого SQL). Вы можете добавить строку идентификатора к вашим data.table с помощью шаблона high-low, чтобы решить эту проблему (high = уникальное значение для каждого сеанса, low = последовательность R из 1:NROW(data), а затем добавить высокое значение, например. "10000000 «чтобы общие идентификаторы были уникальными во всех ваших сессиях, но, конечно, имели пробелы).

0 голосов
/ 12 сентября 2018

Это может вызвать проблемы, если несколько сеансов одновременно пытаются обновить одну и ту же запись.Один из сеансов может заблокировать запись, поэтому другой сеанс не может обновить ее.Вы можете иметь один сеанс, который выполняет все транзакции вместо 4 сеансов.

...