R:使用RODBC和SQL Server痛苦地降低了读取性能

Jay*_*awk 16 database sql-server performance r rodbc

我是R的新手,但我有兴趣使用Shiny来创建使用存储在SQL Server数据库中的数据的动态图表.为了实现交互性,我想从数据库中引入原始数据并在其中执行计算,R而不是让数据库汇总数据.

我能够使用RODBC,连接到数据库,执行查询,并在a中接收结果data.frame.但是,读取时间R比SQL Server Management Studio(SSMS)中执行的相同查询长约12倍.SSMS需要大约600毫秒,而R大约需要7.6秒.我的问题是我是做错了什么,还是R因为数据库访问速度很慢?如果是这样,是否有更快的替代方案(例如将数据库输出写入文件并读取文件)?

有关可能有用的查询的一些信息:查询检索大约250K行,包含4列.第一列是日期,其他三列是数值.机器运行R和SSMS是一个高端的Win 7工作站,具有32GB的内存.R我正在运行的命令是:

system.time(df <- sqlQuery(cn, query))
Run Code Online (Sandbox Code Playgroud)

返回:

user  system elapsed
7.17   0.01   7.58
Run Code Online (Sandbox Code Playgroud)

有趣的是,似乎从SQL到我的机器的数据传输速度很快,但是R在返回之前,这是忙于内部工作几秒钟data.frame.我看到这一点,因为网络利用率在第一秒激增并几乎立即返回到接近0.然后几秒钟后,R data.frame返回.

小智 14

我会尝试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")
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这绝对解决了这个问题.结果,经过的时间减少到0.84秒. (2认同)
  • JDBC(driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver", classPath = "~/HTS/Data/R/Functions/Driver/sqljdbc41.jar") .jfindClass(as.character(driverClass)[1] 中的错误): 找不到类 知道是什么导致了问题吗? (2认同)