繁体   English   中英

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

[英]dbwritetable from multiple R studio sessions to same SQL table concurrently

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

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

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

请注意,export 是一个 data.table,它与正在写入的 SQL 表具有相同的列,并且会话中的每个“导出”表将相对唯一,但某些列可能具有相同的值(自然)。

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

如果使用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.table添加一个 ID 行来解决这个问题(高 = 每个会话的唯一值,低 = 来自1:NROW(data)的 R 序列,然后添加高值,例如.“10000000”,以便整个会话中的整体 ID 都是唯一的 - 但当然有差距)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM