Не все TSQL-соединения используются параллельно
Мне удалось успешно создать параллельные соединения в 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 позволяет поддерживать до 32 тыс. Подключений, поэтому мы не сталкиваемся с проблемой ограничения сеанса.
ОБНОВЛЕНИЕ 26.07.17 Делаем еще один удар по этой проблеме, и теперь она работает (код не изменился). Не уверен, что произошло между сейчас и первоначальной публикацией, но, возможно, некоторые изменения в настройках сервера MS SQL (маловероятно).
Время вытягивания 7,9 миллионов строк следует кривой, изображенной на рисунке ниже.
1 ответ
SQL Server использует "пул соединений". Обычно установление соединения занимает много времени с нуля. Кроме того, на практике приложения будут создавать повторяющиеся идентичные соединения, поэтому объединение в пул повышает производительность. В некотором смысле, SQL наполовину закрывает соединения, так что следующее соединение начнется с ноги вверх и произойдет намного быстрее.
Могут быть случаи, когда вы не хотите использовать пул, и это, вероятно, один из них. Отключить пул, добавив "pooling=false;' как упомянуто выше @rene-lykke-dahl должен решить проблему.
Вы можете узнать больше о пуле соединений здесь.
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling