Не все 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 миллионов строк следует кривой, изображенной на рисунке ниже.

Время против SQL-соединений

1 ответ

SQL Server использует "пул соединений". Обычно установление соединения занимает много времени с нуля. Кроме того, на практике приложения будут создавать повторяющиеся идентичные соединения, поэтому объединение в пул повышает производительность. В некотором смысле, SQL наполовину закрывает соединения, так что следующее соединение начнется с ноги вверх и произойдет намного быстрее.

Могут быть случаи, когда вы не хотите использовать пул, и это, вероятно, один из них. Отключить пул, добавив "pooling=false;' как упомянуто выше @rene-lykke-dahl должен решить проблему.

Вы можете узнать больше о пуле соединений здесь.

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling

Другие вопросы по тегам