了解并行 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 连接的主要内容,如果未能解决你的问题,请参考以下文章

GoogLeNet(含并行连接的网络)

并行计算开发了解

了解 PostgreSQL 并行查询的会话中工作池中剩余多少并行工作人员?

并行与串行的区别及并行通信的系统同步方式

了解 CUDA 中的动态并行性

一文了解预训练相关加速技巧