dbwritetable从多个R Studio会话同时到同一SQL表

时间:2018-09-12 10:53:27

标签: r rstudio dbi

我从RStudio开始了4个会话,在任务管理器上看到了4个“ R Studio R会话”。我使用相同的dsn名称连接到每个会话中的同一SQL数据库表和dbwritetable。

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

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

请注意,export是一个data.table,它具有与要写入的SQL表相同的列,并且会话中的每个“ export”表都将相对唯一,但某些列的值自然是相同的。 / p>

我希望在每个会话中同时执行多次写入。每个会话都执行一些计算,然后dbwritetable将data.table写入SQL表。这会引起任何问题吗?我有什么办法可以确保没有问题?谢谢!

2 个答案:

答案 0 :(得分:0)

如果多个会话试图同时更新同一记录,则可能导致问题。一个会话可以锁定记录,因此另一个会话无法更新它。 您可以有一个会话执行所有事务,而不是4个会话。

答案 1 :(得分:0)

如果已在同一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那样在多个会话中并行运行代码的风险,例如行的不确定插入顺序(如果尝试重现该行为,则可能导致同一插入行的autoinc值不同) )。

您还将有四个打开的连接(完全没有问题)。

如果您的目标是插入性能,则可以使用SQL Server的不同批量插入方法,但是dbWriteTable的性能非常好(如果使用最新版本)。

有关通过odbc软件包进行的“批量上传”的详细信息,请参见:

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

稍后添加:

  

会话中的每个“导出”表将相对唯一   但是某些列的值(自然)可能相同。

如果目标表没有主键,那没问题 插入重复的行(直到您要重新标识单个 行,但这是纯SQL问题)。您可以使用高低模式将ID行添加到data.table中以解决此问题(高=每个会话的唯一值,低=来自1:NROW(data)的R序列,然后添加高值,例如“ 10000000”,这样,整个会话中的总ID都是唯一的-当然会有差距。

相关问题