Pourquoi le server Sql 2014 fonctionne-t-il très lentement lors de la vérification des dates?

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