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
просто очень медленно с доступом к базе данных? И если да, есть ли более быстрые альтернативы (например, запись выходных данных базы данных в файл и чтение файла)?
Немного информации о запросе, которая может помочь: Запрос извлекает около 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
, Я вижу это, потому что загрузка сети резко возрастает в первую секунду и почти сразу возвращается к нулю. Затем, через несколько секунд, R
data.frame
возвращается.
2 ответа
Я бы попробовал 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")
Я хотел бы убедиться, что ваш часовой пояс R - sys.setenv(TZ='GMT'), установленный, например, в GMT - совпадает с часовым поясом сервера SQL, из которого вы извлекаете данные. Возможно, для интерпретации столбца даты требуется много времени, особенно если у него есть временная метка.
RJDBC будет работать быстрее, потому что он преобразует дату в символ и все остальное в число. RODBC попытается сохранить тип данных таблицы SQL.