dbwritetable可以同时从多个R studio会话到同一个SQL表

问题描述 投票:1回答:2

我从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”表都是相对唯一的,但某些列可能具有相同的值(当然)。

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

r rstudio dbi
2个回答
0
投票

如果多个会话尝试同时更新同一记录,这可能会导致问题。其中一个会话可以锁定记录,以便其他会话无法更新它。您可以使用单个会话执行所有事务而不是4个会话。


0
投票

如果使用SQL Server Native Client 11.0(我没有安装驱动程序)在相同的SQL Server 2016版本上测试了您的代码,并跟踪在服务器上执行的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问题)。您可以使用高 - 低模式向您的data.tables添加ID行来解决此问题(高=每个会话的唯一值,低=来自1:NROW(data)的R序列然后添加高值,例如“10000000”以便整体ID在您的会话中是唯一的 - 但当然有差距)。

© www.soinside.com 2019 - 2024. All rights reserved.