2016-02-16 3 views
-2

Création d'une requête SQL pour récapituler certaines données. C'est lent, alors j'ai pensé demander de l'aide.Affiner ma requête T-SQL pour augmenter les performances

table est une table de journal qui a:

loc, tag, entrytime, exittime, visits, entrywt, exitwt 

Mon journal de test a 700.000 dossiers en elle. Les entrytime et exittime sont des valeurs d'époque.

Je sais que ma requête est inefficace car elle déchire la table 4 fois.

select 
    loc, edate, tag, 
    (select COUNT(*) from mylog as ml 
    where mvlog.loc = ml.loc 
     and mvlog.edate = CONVERT(date, DATEADD(ss, ml.entrytime, '19700101')) 
     and mvlog.tag = ml.tag) as visits, 
    (select SUM(entrywt - exitwt) from mylog as ml2 
    where mvlog.loc = ml2.loc 
     and mvlog.edate = CONVERT(date, DATEADD(ss, ml2.entrytime, '19700101')) 
     and mvlog.tag = ml2.tag) as consumed, 
    (select SUM(exittime - entrytime) from mylog as ml3 
    where mvlog.loc = ml3.loc 
     and mvlog.edate = CONVERT(date, DATEADD(ss, ml3.entrytime, '19700101')) 
     and mvlog.tag = ml3.tag) as occupancy 
from 
    eventlogV as mvlog with (INDEX(pt_index)) 

Index pt_index est composé de colonnes tag et loc.

Lorsque j'exécute cette requête, elle se termine en 30 secondes environ. Comme ma requête est inefficace, je suis sûr que ça peut être mieux.

Toutes les idées ont été appréciées.

+2

Pouvez-vous publier le plan d'exécution? Peut-être nous donner quelques définitions de table/index? –

+0

'eventlogV' et' mylog' sont deux tables différentes? –

+0

Je crois que tout type de question 'refine' est mieux posté sur http://codereview.stackexchange.com/. – Ralph

Répondre

2

On dirait que vous pouvez simplement REJOINDRE mylog à eventlogV une fois et obtenir les mêmes résultats.

SELECT mvlog.loc, 
     mvlog.edate, 
     mvlog.tag, 
     COUNT(ml.loc) AS visits, 
     SUM(entrywt - exitwt) AS consumed, 
     SUM(exittime - entrytime) AS occupancy 
FROM eventlogV AS mvlog 
     LEFT OUTER JOIN mylog ml ON mvlog.loc = ml.loc 
            AND mvlog.edate = CONVERT(DATE,DATEADD(ss,ml.entrytime,'19700101')) 
            AND mvlog.tag = ml.tag 
GROUP BY mvlog.loc, 
     mvlog.edate, 
     mvlog.tag 
+0

non ... ce serait moi. – Hogan

+0

Ran votre version de la requête et il a terminé en 25 secondes contre 30 secondes pour l'original. –

+0

Ce n'est pas difficile à croire .. le AND mvlog.edate = CONVERT (DATE, DATEADD (ss, ml.entrytime, '19700101')) 'partie est probablement votre tueur – JamieD77