了解并行 TSQL 连接
Posted
技术标签:
【中文标题】了解并行 TSQL 连接【英文标题】:Understanding parallel TSQL connections 【发布时间】:2016-12-24 07:17:37 【问题描述】:我设法使用以下代码在 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 服务器和 R 都在同一台服务器上,因此网络延迟不是问题。 TSQL 服务器最多允许约 32k 连接,因此我们不会遇到会话限制问题。2017 年 7 月 26 日更新 再次尝试解决这个问题,它现在可以工作(代码未更改)。不确定从现在到最初发布之间发生了什么,但可能对 MS SQL 服务器设置进行了一些更改(不太可能)。
提取 790 万行的时间遵循下图中的曲线。
【问题讨论】:
【参考方案1】:SQL Server 使用“连接池”。
从头开始建立连接需要很长时间。
应用程序会重复建立相同的连接,因此池可提高性能。 SQL 半关闭连接,因此下一个连接将开始以上升并且更快。
您不想在您的实例中使用池。 您可以通过添加 "pooling=false;" 来关闭池,如上所述 @rene-lykke-dahl。这应该可以解决您的问题。
了解连接池here:
【讨论】:
以上是关于了解并行 TSQL 连接的主要内容,如果未能解决你的问题,请参考以下文章