标准RODBC软件包的sqlSave
函数即使作为单个INSERT
语句(参数fast = TRUE
),由于非最小负载,对于大量数据来说非常慢。如何以最少的日志记录将数据写入我的SQL服务器,以便更快地写入?
目前正在尝试:
toSQL = data.frame(...);
sqlSave(channel,toSQL,tablename="Table1",rownames=FALSE,colnames=FALSE,safer=FALSE,fast=TRUE);
答案 0 :(得分:31)
通过在本地将数据写入CSV然后使用BULK INSERT
(不像sqlSave
那样的预建功能可用),可以非常快速地将数据写入MS SQL Server。
toSQL = data.frame(...);
write.table(toSQL,"C:\\export\\filename.txt",quote=FALSE,sep=",",row.names=FALSE,col.names=FALSE,append=FALSE);
sqlQuery(channel,"BULK
INSERT Yada.dbo.yada
FROM '\\\\<server-that-SQL-server-can-see>\\export\\filename.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\\n'
)");
SQL Server必须具有访问包含CSV文件的网络文件夹的权限,否则此过程将无效。虽然它需要一些具有各种权限的设置(网络文件夹和BULK ADMIN
权限,但速度的奖励无限更有价值。)
答案 1 :(得分:0)
我完全同意BULK INSERT
是非小型的任何数据的正确选项。
但是,如果您需要添加2-3行,例如调试消息它BULK INSERT
似乎有点矫枉过正。
您的问题的答案是DBI::dbWriteTable()
函数。下面的示例(我将我的R代码连接到AWS RDS
的{{1}}实例):
MS SQL Express
对于传输的少量数据,它的工作速度非常快,如果你想要library(DBI)
library(RJDBC)
library(tidyverse)
# Specify where you driver lives
drv <- JDBC(
"com.microsoft.sqlserver.jdbc.SQLServerDriver",
"c:/R/SQL/sqljdbc42.jar")
# Connect to AWS RDS instance
conn <- drv %>%
dbConnect(
host = "jdbc:sqlserver://xxx.ccgqenhjdi18.ap-southeast-2.rds.amazonaws.com",
user = "xxx",
password = "********",
port = 1433,
dbname= "qlik")
if(0) { # check what the conn object has access to
queryResults <- conn %>%
dbGetQuery("select * from information_schema.tables")
}
# Create test data
example_data <- data.frame(animal=c("dog", "cat", "sea cucumber", "sea urchin"),
feel=c("furry", "furry", "squishy", "spiny"),
weight=c(45, 8, 1.1, 0.8))
# Works in 20ms in my case
system.time(
conn %>% dbWriteTable(
"qlik.export.test",
example_data
)
)
# Let us see if we see the exported results
conn %>% dbGetQuery("select * FROM qlik.export.test")
# Let's clean the mess and force-close connection at the end of the process
conn %>% dbDisconnect()
- &gt;,它看起来相当优雅。 data.frame
解决方案。
享受!