我设法使用以下代码在 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 万行的时间遵循下图中的曲线。