標準のRODBCパッケージのsqlSave
関数は、単一のINSERT
ステートメント(パラメーターfast = TRUE
)は、読み込みが最小限ではないため、大量のデータの場合は非常に遅くなります。最小限のログでSQLサーバーにデータを書き込み、より速く書き込むにはどうすればよいですか?
現在試行中:
toSQL = data.frame(...);
sqlSave(channel,toSQL,tablename="Table1",rownames=FALSE,colnames=FALSE,safer=FALSE,fast=TRUE);
ローカルで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
特権、速度における報酬は無限に価値があります)。
_BULK INSERT
_がnon-tinyであるすべてのデータの正しいオプションであることに私は完全に同意します。ただし、2〜3行を追加する必要がある場合など。 _BULK INSERT
_のデバッグメッセージはやりすぎだと思われます。
あなたの質問に対する答えはDBI::dbWriteTable()
関数です。以下の例(Rコードを_AWS RDS
_の_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()
_
転送される少量のデータに対しては非常に高速に動作し、_data.frame
_-> _SQL table
_ソリューションが必要な場合はかなりエレガントに見えます。
楽しい!