r - 了解并行TSQL连接

标签 r tsql 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)
我希望看到所有连接都正在并行地主动下载,但实际情况是一次只能连接一个或两个连接(请参见下图)。
即使使用32个连接,总下载时间也减少了1/2多倍(理论上应该接近1/32,对吧?)。连接事件之间也有很大的停顿。 这是为什么?
Connection Utilization
请注意以下几点:
  • TSQL的 TSQL 服务器和 R 都在同一服务器上,因此网络延迟不是问题。
  • TSQL服务器最多允许约32k的连接,因此我们不会遇到 session 限制问题。

  • 更新7/26/17
    再次解决这个问题,它现在可以工作了(代码不变)。不知道从现在到首次发布之间发生了什么,但可能是对MS SQL Server设置进行了一些更改(不太可能)。
    拉下790万行的时间遵循下图中的曲线。
    Time versus SQL Connections

    最佳答案

    SQL Server使用“连接池”。
    从头开始建立连接需要花费大量时间。
    应用程序将重复进行相同的连接,因此池可提高性能。 SQL将半关闭连接,因此下一个连接将由并由到来启动,并且要快得多。
    您不想在实例中使用池。
    您可以通过添加“pooling = false;”来关闭池。如上所述
    @ rene-lykke-dahl 。那应该解决您的问题。
    了解有关连接池here: 的信息

    关于r - 了解并行TSQL连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38999892/

    相关文章:

    sql - 如何避免因 1 NULL 而导致整个 INSERT 批处理失败

    r - 在 R 中使用 doParallel 的 foreach 时,Windows Defender 的 CPU 使用率非常高

    sql - 为什么这个 sql 行不工作

    sql - 如何在 'IN' 语句 (T-SQL) 中为每列值选择 10 行

    r - 并行化不适用于 foreach 包

    r - 匹配两组数字组合

    R rbind 同时保留每个数据帧中的顺序或行

    r - `smooth.spline` 严重欠拟合长(周期)时间序列

    c++ - 从 R 访问 C++ 对象数据成员