9

我设法使用以下代码在 R 中创建到 TSQL 服务器的并行连接:

SQL_retrieve <- function(x){
con <- odbcDriverConnect(
'driver={SQL Server};server=OPTMSLMSOFT02;database=Ad_History;trusted_connection=true')

odbcGetInfo(con)
rawData <- sqlQuery(con,
paste("select * from AD_MDL_R_INPUT a where a.itm_lctn_num = ",
facility[x] )) odbcClose(con) return(rawData) }

cl <- makeCluster(5) registerDoParallel(cl)
outputPar <- foreach(j = 1:facility_count, .packages="RODBC")
%dopar% SQL_retrieve(j) stopCluster(cl)

我希望看到所有连接都在并行下载,但实际情况是一次只有一个或两个连接处于活动状态(见下图)。
即使有 32 个连接,总下载时间也减少了 1/2 以上(理论上应该更接近 1/32,对吧?)。连接活动之间也有很大的停顿。 为什么是这样?

连接利用率

要记住的一些注意事项:

  • TSQL服务器和R都在同一台服务器上,因此网络延迟不是问题。
  • TSQL 服务器最多允许约 32k 连接,因此我们不会遇到会话限制问题。

更新 2017 年 7 月 26 日 再次尝试解决这个问题,它现在可以工作(代码未更改)。不确定从现在到最初发布之间发生了什么,但可能对 MS SQL 服务器设置进行了一些更改(不太可能)。

提取 790 万行的时间遵循下图中的曲线。

时间与 SQL 连接

4

1 回答 1

1

SQL Server 使用“连接池”。

从头开始建立连接需要花费大量时间。

应用程序将重复建立相同的连接,因此池化提高了性能。SQL 半关闭连接,因此下一个连接将从一个腿开始并且更快。

您不想在您的实例中使用池。您可以通过添加“pooling=false;”来关闭池化 如上所述 @rene-lykke-dahl。那应该可以解决您的问题。

在此处阅读有关连接池的信息:

于 2017-11-22T14:00:50.083 回答