#r #sql-server #dbi #r-dbi
Вопрос:
Я работаю с фреймом данных c. 700k строк и 400 столбцов, которые я загружаю на Microsoft SQL Server. В настоящее время я использую код:
dbWriteTable(conn = con,
name = "table_test",
value = x,
row.names = FALSE
)
из библиотеки library(odbc)
и con
осуществляется ли мое соединение с помощью функции dbConnect
Код действительно запускается, но это занимает несколько часов. Есть ли какой-нибудь более быстрый способ сделать это?
Комментарии:
1. Я использую
DBI
иodbc
вставляю данные 2M строк (по крайней мере, еженедельно) уже несколько лет, и использованиеdbWriteTable
(как вы обнаружили) слишком медленное, поэтому я использую инструмент командной строкиbcp
( docs.microsoft.com/en-us/sql/tools/… ). У него есть некоторые проблемы ; а именно, он тупо думает о значениях в кавычках, игнорируя стандарт CSV (RFC-4180) для встроенных кавычек, и он не различает""
(пустая строка) и null. Хорошего инструмента нет, вам придется решать эти проблемы вручную.2. @r2evans bcp.exe это безнадежное дело. Начиная с SQL Server 2017
BULK INSERT
может работать с файлами RFC 4180. (Прошло всего двенадцать лет.)3. Таким образом, информативно сказать, что сервер, к которому я могу получить доступ (но не администрирую), 2016 года (старше 4 лет). И это угнетает (меня). И они сохраняют уровень совместимости на уровне 120 (вместо 130 , что добавляет
openjson
и тому подобное).4. @AlwaysLearning :
BULK INSERT
звучит здорово, если у вас есть доступ к BLOB-объектов Azure или файловую систему (например, протокол CIFS) работает как пользователем, так и сервер (я не собираюсь открывать окна делятся на «мой компьютер» для того, чтобы загрузить на сервер в основном (но не полностью), потому что Киф через SSH-это кошмар, благодаря Microsoft. Это хорошая идея, но вряд ли это решение для большинства пользователей.