并非所有TSQL连接都是并行使用的

Eva*_*son 8 sql t-sql foreach r parallel-foreach

我已成功使用以下代码在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)
Run Code Online (Sandbox Code Playgroud)

我希望所有连接都能并行地主动下载,但实际情况是,一次只有一个或两个连接处于活动状态(见下图).这与创建的集群/连接数无关.即使有32个连接,总下载时间也会略微超过1/2(理论上应该接近1/32,对吧?).连接活动之间也有很大的暂停.为什么是这样?我在这里错过了什么?

连接利用率

请记住一些注意事项:

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

更新7/26/17 再次尝试这个问题,它现在有效(代码不变).不确定从现在到最初发布之间发生了什么,但可能对MS SQL服务器设置进行了一些更改(不太可能).

拉动790万行的时间遵循下图中的曲线.

时间与SQL连接

Jas*_*ger 1

SQL Server 使用“连接池”。

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

应用程序将进行重复的相同连接,因此池化可以提高性能。SQL 半关闭连接,因此下一个连接将优先启动并且速度更快。

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

在这里阅读有关连接池的信息