Rは初めてですが、Shinyを使用して、SQL Serverデータベースに格納されているデータを使用して動的なグラフを作成することに興味があります。インタラクティブ機能を有効にするには、データベースにデータを要約させるのではなく、データベースから生データを取り込み、R
内で計算を実行したいと思います。
RODBC
を使用してデータベースに接続し、クエリを実行して、結果をdata.frame
。ただし、R
の読み取り時間は、SQL Server Management Studio(SSMS)で実行される同じクエリよりも約12倍長くなります。 SSMSは約600ミリ秒かかりますが、R
は約7.6秒かかります。私の質問は、私が何か間違ったことをしているのか、それともデータベースアクセスでR
が本当に遅いのか、ということです。もしそうなら、より速い代替手段がありますか(たとえば、データベース出力をファイルに書き込んでファイルを読み取るなど)?
役立つ可能性があるクエリに関するいくつかの情報:クエリは、4つの列を持つ約25万行を取得します。最初の列は日付で、他の3つは数値です。 R
およびSSMSを実行しているマシンは、32GBのメモリを備えたハイエンドのWindows 7ワークステーションです。私が実行しているR
コマンドは次のとおりです。
system.time(df <- sqlQuery(cn, query))
これは次を返します:
user system elapsed
7.17 0.01 7.58
興味深いことに、SQLから私のマシンへのデータ転送は高速であるように見えますが、R
はdata.frame
。最初の1秒間でネットワーク使用率が急上昇し、ほぼ即座に0近くに戻るため、これがわかります。数秒後、R
data.frame
戻り値。
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テーブルのデータ型を保持しようとします。