2015-06-19 5 views
13

Sono nuovo a R ma sono interessato all'utilizzo di Shiny per creare grafici dinamici utilizzando i dati memorizzati in un database SQL Server. Per abilitare l'interattività, voglio inserire i dati grezzi dal database ed eseguire i calcoli entro R piuttosto che fare in modo che il database riepiloghi i dati.R: Prestazioni di lettura estremamente lente con RODBC e SQL Server

Sono in grado di connettersi al database utilizzando RODBC, eseguire una query e ricevere risultati in un data.frame. Tuttavia, il tempo di lettura in R è circa 12 volte più lungo della stessa query eseguita in SQL Server Management Studio (SSMS). SSMS richiede ~ 600 ms, mentre R richiede circa 7,6 secondi. La mia domanda è se sto facendo qualcosa di sbagliato, o R è davvero lento con l'accesso al database? E se sì, ci sono alternative più veloci (ad esempio scrivere l'output del database in un file e leggere il file)?

Alcune informazioni sulla query che possono aiutare: La query recupera circa 250K righe con 4 colonne. La prima colonna è una data e gli altri tre sono valori numerici. La macchina che esegue R e SSMS è una workstation Win 7 di fascia alta con 32 GB di memoria. Il comando R che io sono in esecuzione è:

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

che restituisce:

user system elapsed 
7.17 0.01 7.58 

È interessante notare, sembra che il trasferimento dei dati da SQL alla mia macchina è veloce, ma che R è occupato a fare le cose internamente per alcuni secondi prima di restituire il data.frame. Lo vedo perché l'utilizzo della rete aumenta nel primo secondo e quasi immediatamente ritorna a vicino a 0. Quindi, alcuni secondi dopo, viene restituito lo Rdata.frame.

+0

Piuttosto sicuro che sia solo così lento, l'abbiamo valutato qualche tempo fa e abbiamo deciso di fare un altro percorso usando RODBC, è solo un modo per rallentare tranne che per query molto semplici. – Hansi

risposta

11

vorrei provare RJDBC http://cran.r-project.org/web/packages/RJDBC/RJDBC.pdf

con questi driver 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

Grazie! Questo risolve completamente il problema. Di conseguenza, il tempo trascorso è sceso a 0,84 secondi. – Jayhawk

0

vorrei fare in modo che il vostro R fuso orario - sys.setenv (TZ = 'GMT') impostato su GMT per esempio - è uguale al fuso orario del server SQL da cui vengono estratti i dati. Potrebbe essere che la colonna della data impiega molto tempo per essere interpretata, specialmente se ha un timestamp.

RJDBC verrà eseguito più rapidamente perché converte la data in carattere e tutto il resto in numerico. RODBC proverà a conservare il tipo di dati della tabella SQL.

Problemi correlati