web-dev-qa-db-fra.com

R: Péniblement ralentir les performances de lecture avec ODBC et SQL Server

Je suis nouveau sur R mais je suis intéressé par l’utilisation de Shiny pour créer des graphiques dynamiques à l’aide de données stockées dans une base de données SQL Server. Pour permettre l'interactivité, je souhaite importer les données brutes de la base de données et effectuer des calculs dans la variable R plutôt que de demander à la base de données de résumer les données.

Je peux me connecter à la base de données en utilisant RODBC, exécuter une requête et recevoir les résultats dans un data.frame. Toutefois, le temps de lecture dans R est environ 12 fois plus long que la même requête exécutée dans SQL Server Management Studio (SSMS). SSMS prend environ 600 ms, alors que R prend environ 7,6 secondes. Ma question est de savoir si je fais quelque chose de mal ou si R est vraiment lent avec l'accès à la base de données? Et si oui, existe-t-il des alternatives plus rapides (par exemple, écrire la sortie de la base de données dans un fichier et lire le fichier)?

Quelques informations sur la requête qui peuvent aider: La requête récupère environ 250 000 lignes avec 4 colonnes. La première colonne est une date et les trois autres sont des valeurs numériques. La machine qui exécute R et SSMS est une station de travail Windows 7 haut de gamme dotée de 32 Go de mémoire. La commande R que j'exécute est la suivante:

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

qui retourne:

user  system elapsed
7.17   0.01   7.58

Fait intéressant, il semble que le transfert de données de SQL vers ma machine soit rapide, mais que R est occupé à effectuer des tâches en interne pendant plusieurs secondes avant de renvoyer le data.frame. Je vois cela parce que l'utilisation du réseau atteint un pic dans la première seconde et revient presque immédiatement à près de 0. Puis quelques secondes plus tard, la Rdata.frame est renvoyée.

14
Jayhawk

Je voudrais essayer RJDBC http://cran.r-project.org/web/packages/RJDBC/RJDBC.pdf

avec ces pilotes 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")
13
Ken Yeoh

Je voudrais m'assurer que votre fuseau horaire R - sys.setenv (TZ = 'GMT') défini sur GMT par exemple - est identique au fuseau horaire du serveur SQL à partir duquel vous extrayez des données. Il se peut que la colonne de date prenne beaucoup de temps à être interprétée, surtout si elle a un horodatage.

RJDBC sera plus rapide car il convertira la date en caractère et tout le reste en numérique. RODBC essaiera de préserver le type de données de la table SQL.

0
charliealpha