2015-06-19 7 views
13

Я новичок в R, но я заинтересован в использовании Shiny для создания динамических диаграмм с использованием данных, хранящихся в базе данных SQL Server. Чтобы включить интерактивность, я хочу собрать необработанные данные из базы данных и выполнить вычисления в пределах R, а не суммировать данные базы данных.R: Ужасно медленная производительность чтения с использованием RODBC и SQL Server

Я могу подключиться к базе данных с помощью RODBC, выполнить запрос и получить результаты в data.frame. Однако время чтения в R примерно на 12 раз больше, чем тот же запрос, выполненный в SQL Server Management Studio (SSMS). SSMS занимает ~ 600 мс, тогда как R занимает около 7,6 секунды. Мой вопрос заключается в том, что я делаю что-то неправильно или R просто очень медленно с доступом к базе данных? И если да, есть ли более быстрые альтернативы (например, запись вывода базы данных в файл и чтение файла)?

Некоторая информация о запросе, который может помочь: запрос извлекает около 250 тыс. Строк с 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. Я вижу это, потому что использование сети всплескивается в первую секунду и почти сразу возвращается к нулю. Затем несколько секунд спустя возвращается Rdata.frame.

+0

Довольно точно, что это было так медленно, мы оценили его некоторое время назад и решили пойти другим путем, используя RODBC, это просто способ замедлить, за исключением очень простых запросов. – Hansi

ответ

11

Я хотел бы попробовать 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

Спасибо! Это решило проблему. В результате прошедшее время упало до 0,84 секунды. – Jayhawk

0

Я хотел бы убедиться, что ваш часовой пояс R - sys.setenv (TZ = 'GMT') установлен в GMT, например - совпадает с часовым поясом SQL-сервера, откуда вы извлекаете данные. Может быть, столбец даты занимает много времени, чтобы его интерпретировать, особенно если у него есть метка времени.

RJDBC будет работать быстрее, потому что он преобразует дату в символ и все остальное в числовое. RODBC попытается сохранить тип данных таблицы SQL.