Lorsque j'exécute la requête ci-dessous, cela prend presque 2,30 min.
select Clientid, Sum(Qty * Rate) BuyVolume from Table1 S(nolock) join table2 T on T.ReferrentClientId = S.Clientid where S.Column2 = 'B' and S.Date >= T.Date and S.Date <= T.Date +30 Group by Clientid
mais quand je donne T.Date comme '2016-12-23 00: 00: 00.000', le résultat est en 1 sec.
select Clientid, Sum(Qty * Rate) BuyVolume from Table1 S(nolock) join table2 T on T.ReferrentClientId = S.Clientid where S.Column2= 'B' and S.Date >= '2015-12-23 00:00:00.000' and S.Date <= '2016-01-22 00:00:00.000' Group by Clientid
La table1 contient 47589000 lignes et la table2 contient seulement 5 lignes. Le jeu de résultats contient uniquement deux lignes. Les deux colonnes de date sont au format Datetime.
Y a-t-il un moyen d'accélérer mon exécution?
La différence est définitivement dans la façon dont la requête est optimisée. Vous devriez regarder les plans d'exécution pour get plus d'informations.
Ceci est votre requête:
select Clientid, Sum(Qty*Rate) as BuyVolume from Table1 S join table2 T on T.ReferrentClientId = S.Clientid where S.Column2 = 'B' and S.Date >= T.Date and S.Date <= T.Date + 30 Group by Clientid;
La première suggestion est un index sur Table1(Column2, Date, ClientId)
.
Cependant, comme table2
est si petite, vous voulez vraiment en faire la table de pilotage de la join
. Cela suggérerait un index alternatif sur Table1(ClientId, Column2, Date)
. Cela devrait faire la join
premier, ce qui devrait réduire considérablement le nombre de lignes en cours de traitement.
Mon intuition quant à ce qui se passe ici est que dans la première requête, la clause WHERE
nécessite de searchr la valeur Date
pour chaque logging dans la jointure, alors que dans la deuxième requête cela ne doit pas se produire. Une possibilité est que l'optimiseur de requête table2
complètement l'étape de search des valeurs dans table2
lors de l'exécution de la clause WHERE
dans votre deuxième requête.
Notez que la clause WHERE
s'exécute avant GROUP BY
, donc ces requêtes semblent être identiques à la clause WHERE
.
Selon les différentes suggestions d'ici, j'ai créé un NONCLUSTERED INDEX
sur ma table comme ci-dessous.
create NONCLUSTERED index myIndex on Table1(Column2) include (Date,Clientid,qty,rate)
Maintenant, il ne prend que 7 secondes pour get le résultat. Merci pour toutes les réponses et commentaires.
Essaye ça.
select Clientid, Sum(Qty * Rate) BuyVolume from Table1 S(nolock) join table2 T on T.ReferrentClientId = S.Clientid where S.Column2 = 'B' and S.Date between T.Date and T.Date + 30 and S.Date between (select min(Date) from table2) and (select max(Date) from table2) + 30 Group by Clientid