2017-09-25 1 views
1

Je regarde une requête avec, dans le cadre de la clause where, DateDiff(month, table1.dateReported, table2.dateTransDate) <= 6, où dateReported et dateTransdate sont dans des tables différentes. J'ai récemment lu que l'utilisation de fonctions SQL dans une clause where peut entraîner des problèmes de performances. Comment puis-je modifier cela pour ne pas utiliser le datediff?Élimination de DateDiff dans SQL Server où clause

Il est essentiellement une approche avec quelque chose comme

SELECT * 
FROM Table1 
LEFT JOIN Table2 on Table1.transactionID = Table2.transactionID 
WHERE DateDiff(month, Table1.dateReported, Table2 .dateTransDate) <= 6 
+0

ce ne sera pas votre principale préoccupation, pourquoi ne pas utiliser la fonction de construction si elles vous ont déjà pointé un raccourci xD – LONG

+1

Dater reportées et datetransdate dans la même table ou des tables séparées? Si ce n'est pas le cas, il ne sera pas sargable (du moins sans créer une colonne calculée). Si vous le séparez, vous pouvez le rendre sargable pour une colonne mais pas pour l'autre. Ce qui sera le mieux dépend. –

+0

Veuillez inclure la question que vous avez déjà dans votre question. Indiquez clairement de quelle (s) table (s) proviennent les colonnes de votre expression DateDiff. –

Répondre

3

Vous pouvez utiliser

WHERE Table1.dateReported >= 
    /*First day of the month six months previous to Table2.dateTransDate*/ 
    DATEADD(month, -6 + DATEDIFF(month, 0, Table2.dateTransDate), 0) 

pour permettre éventuellement un index sur Table1.transactionID, Table1.dateReported à utiliser.

Ou

Table2.dateTransDate <= 
    /*Last day of the month six months after Table1.dateReported*/ 
    DATEADD(DAY,-1,DATEADD(month, 7 + DATEDIFF(month, 0, Table1.dateReported), 0)) 

pour permettre éventuellement un index sur Table2.transactionID, Table2.dateTransDate à utiliser.

A test rig is here to validate it for a cross joined year of dates to ensure all three return the same results.

+0

Cela semble avoir rasé ~ 1 seconde de la requête, donc assez cool d'avoir appris. –