web-dev-qa-db-ja.com

R:ODBCとSQL Serverを使用した読み込みパフォーマンスの痛みが遅い

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から私のマシンへのデータ転送は高速であるように見えますが、Rdata.frame。最初の1秒間でネットワーク使用率が急上昇し、ほぼ即座に0近くに戻るため、これがわかります。数秒後、Rdata.frame 戻り値。

17
Jayhawk

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")
14
Ken Yeoh

Rタイムゾーン(たとえば、sys.setenv(TZ = 'GMT')をGMTに設定)が、データを取得するSQLサーバーのタイムゾーンと同じであることを確認します。特にタイムスタンプがある場合、日付列の解釈に時間がかかる可能性があります。

RJDBCは日付を文字に変換し、その他はすべて数値に変換するため、実行が速くなります。 RODBCは、SQLテーブルのデータ型を保持しようとします。

1
charliealpha