Подтвердить что ты не робот

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.

4b9b3361

Ответ 2

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

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