2017-09-18 5 views
0

J'ai besoin d'aide avec RODBC sqlQuery. Je cours un script SQL qui produit 11millions de rangées de données. Il faut 78 secondes pour extraire des données en utilisant RODBC mais malheureusement, quand j'inclus un champ de date/heure, il faut 180 secondes pour extraire des données de RODBC et seulement 78 secondes dans Management Studio. Je voudrais savoir pourquoi s'il vous plaît et ce que je pourrais faire à ce sujet.Le champ date de RODBC posixct rend la requête très lente

Le champ de date/heure est de ce format sur le serveur Sql: AAAA-MM-JJ HH: MM: SS.000

Je fais que je fais Sys.setenv(TZ="UTC") avant exécuter cette requête:

lossdata <- as.data.table(sqlQuery(dbhandle, qry)) 

qry est une chaîne et dbhandle est défini à l'aide odbcDriverConnect.

Je reçois le champ date/heure dans ce format quand je tire de R: YYYY-MM-DD HH:MM:SS (without .000)

J'ai essayé RJDBC trop mais il faut en même temps. Cela prend également trop de temps pour convertir le champ date/heure du caractère en posixct après avoir utilisé RJDBC, ce n'est donc pas une bonne option. Malheureusement, j'ai besoin que le champ soit dans posixct car je l'utilise dans le tri et cela prend trop de temps s'il n'est pas de ce type de données.

Aidez-nous s'il vous plaît. Je ne suis pas sûr de savoir comment je peux reproduire cet exemple. S'il vous plaît laissez-moi savoir si vous avez besoin d'informations supplémentaires.

requêtes SQL

Avec EventDate

select pp.EventDate as EVENTDATE, pp.EVENTID as EVENTID 
from 
    (select * from set.dbo.events where setid in (16,32)) pp 
    inner join 
     (select eventid from databasename.dbo.rdm_port where anls = 93) y 
    on pp.EventId = y.EVENTID 

Sans EventDate

select pp.EVENTID as EVENTID 
from 
    (select * from set.dbo.events where setid in (16,32)) pp 
    inner join 
     (select eventid from databasename.dbo.rdm_port where anls = 93) y 
    on pp.EventId = y.EVENTID 
+0

Veuillez afficher une requête qui inclut le datetime et une qui ne voit pas comment les calculs sont exécutés. – Parfait

+0

J'ai fait le script plus petit pour le rendre lisible, laissez-moi savoir si vous avez des questions. – charliealpha

+0

RODBC convertit peut-être votre colonne DateTime d'un caractère en Date en utilisant la fonction 'as.Date', qui est très lente. Voir https://stackoverflow.com/a/12788992/6004997 pour plus de détails: "Donc le noeud du problème (je pense) est la raison pour laquelle strptime est si lent, et peut-être que cela peut être amélioré dans R. Ou simplement éviter POSIXlt, soit directement ou indirectement." –

Répondre

0
DATEDIFF(s,'1970-01-01 00:00:00',pp.EventDate) as EVENTDATE 

A Le fait d'utiliser RJDBC à la place résout ce problème particulier.

RODBC prend plus de temps que RJDBC. Tout est stocké comme numérique en utilisant RJDBC.

La date est maintenant en secondes depuis 1970-01-01 qui est rapide à trier. Il peut être converti en date si besoin est.