2015-06-19 6 views
13

Ich bin neu in R, bin aber daran interessiert, mit Shiny dynamische Diagramme mit Daten in einer SQL Server-Datenbank zu erstellen. Um Interaktivität zu ermöglichen, möchte ich die Rohdaten aus der Datenbank einbringen und Berechnungen innerhalb von R durchführen, anstatt die Daten in der Datenbank zusammenfassen zu lassen.R: schmerzhaft langsam Leseleistung mit RODBC & SQL Server

Ich bin in der Lage, eine Verbindung zur Datenbank mit RODBC, führen Sie eine Abfrage, und erhalten Ergebnisse in einem data.frame. Die Lesezeit in R ist jedoch etwa 12x länger als die gleiche Abfrage in SQL Server Management Studio (SSMS) ausgeführt. SSMS dauert ~ 600 ms, während R etwa 7,6 Sekunden dauert. Meine Frage ist, ob ich etwas falsch mache, oder ist R gerade wirklich langsam mit Datenbankzugriff? Und wenn ja, gibt es schnellere Alternativen (z. B. das Schreiben der Datenbankausgabe in eine Datei und das Lesen der Datei)?

Einige Informationen über die Abfrage, die helfen können: Die Abfrage ruft 250 KB Zeilen mit 4 Spalten ab. Die erste Spalte ist ein Datum und die anderen drei sind numerische Werte. Die Maschine läuft R und SSMS ist eine High-End-Win 7-Workstation mit 32 GB Arbeitsspeicher. Der R Befehl, der bei mir läuft ist:

system.time(df <- sqlQuery(cn, query)) 

, die zurückgibt:

user system elapsed 
7.17 0.01 7.58 

Interessanterweise scheint es, dass die Datenübertragung von SQL zu meiner Maschine schnell ist, aber das R ist damit beschäftigt Dinge intern tun für einige Sekunden vor der Rückkehr der data.frame. Ich sehe das, weil die Netzwerkauslastung in der ersten Sekunde Spitzenwerte erreicht und fast sofort wieder in die Nähe von 0 zurückkehrt. Einige Sekunden später kehrt die Rdata.frame zurück.

+0

Ziemlich sicher, dass es nur so langsam ist, haben wir es vor einiger Zeit ausgewertet und entschieden, eine andere Route zu gehen, dann RODBC zu verwenden, es ist nur langsam, außer für sehr einfache Abfragen. – Hansi

Antwort

11

Ich würde versuchen, RJDBC http://cran.r-project.org/web/packages/RJDBC/RJDBC.pdf

mit diesen Treibern 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") 
+2

Danke! Das hat das Problem absolut gelöst. Die verstrichene Zeit sank dadurch auf 0,84 Sekunden. – Jayhawk

0

ich sicher, dass Ihre R Zeitzone machen würde - sys.setenv (TZ = 'GMT') zum Beispiel auf GMT eingestellt - entspricht der Zeitzone des SQL-Servers, von dem Sie Daten abrufen. Es könnte sein, dass die Datumsspalte lange braucht, um interpretiert zu werden, besonders wenn sie einen Zeitstempel hat.

RJDBC wird schneller ausgeführt, da es Datum in Zeichen und alles andere in Zahlen konvertiert. RODBC wird versuchen, den Datentyp der SQL-Tabelle beizubehalten.