我设法使用以下代码在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
请注意以下几点:
更新7/26/17
再次解决这个问题,它现在可以工作了(代码不变)。不知道从现在到首次发布之间发生了什么,但可能是对MS SQL Server设置进行了一些更改(不太可能)。
拉下790万行的时间遵循下图中的曲线。
最佳答案
SQL Server使用“连接池”。
从头开始建立连接需要花费大量时间。
应用程序将重复进行相同的连接,因此池可提高性能。 SQL将半关闭连接,因此下一个连接将由到并由到来启动,并且要快得多。
您不想在实例中使用池。
您可以通过添加“pooling = false;”来关闭池。如上所述
@ rene-lykke-dahl 。那应该解决您的问题。
了解有关连接池here: 的信息
关于r - 了解并行TSQL连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38999892/