R: Ужасно медленная производительность чтения с использованием RODBC и SQL Server
Я новичок в R, но я заинтересован в использовании Shiny для создания динамических диаграмм с использованием данных, хранящихся в базе данных SQL Server. Чтобы включить интерактивность, я хочу собрать необработанные данные из базы данных и выполнить вычисления в R
вместо того, чтобы база данных суммировала данные.
Я могу подключиться к базе данных с помощью RODBC
, выполнить запрос и получить результаты в data.frame
. Однако время чтения в R
примерно на 12 раз больше, чем тот же запрос, выполненный в SQL Server Management Studio (SSMS). SSMS занимает ~ 600 мс, тогда как R
занимает около 7,6 секунды. Мой вопрос заключается в том, что я делаю что-то неправильно или R
просто медленнее с доступом к базе данных? И если да, есть ли более быстрые альтернативы (например, запись вывода базы данных в файл и чтение файла)?
Некоторая информация о запросе, который может помочь: запрос извлекает около 250K строк с 4 столбцами. Первый столбец - это дата, а остальные три - числовые значения. Машина под управлением R
и SSMS - это высокопроизводительная рабочая станция Win 7 с 32 ГБ памяти. Команда R
, которую я запускаю:
system.time(df <- sqlQuery(cn, query))
который возвращает:
user system elapsed
7.17 0.01 7.58
Интересно, что передача данных с SQL на мою машину выполняется быстро, но R
занят внутренними делами в течение нескольких секунд, прежде чем вернуть data.frame
. Я вижу это, потому что загрузка сети увеличивается в первую секунду и почти сразу возвращается к нулю. Затем несколько секунд спустя возвращается R
data.frame
.
Ответы
Ответ 1
Я бы попробовал RJDBC
http://cran.r-project.org/web/packages/RJDBC/RJDBC.pdf
с этими драйверами https://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx
library(RJDBC)
drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver","/sqljdbc4.jar")
con <- dbConnect(drv, "jdbc:sqlserver://server.location", "username", "password")
dbGetQuery(con, "select column_name from table")
Ответ 2
Я бы удостоверился, что ваш часовой пояс R - sys.setenv(TZ = 'GMT'), установленный, например, на GMT, - такой же, как часовой пояс SQL-сервера, откуда вы извлекаете данные. Возможно, столбец даты занимает много времени, особенно если у него есть отметка времени.
RJDBC будет работать быстрее, потому что он преобразует дату в символ и все остальное в числовое. RODBC попытается сохранить тип данных таблицы SQL.