4 votes

Exclure les fonctions de la clause where dans Sql server

J'ai utilisé ci-dessous query dans l'un de mes stored procedures

SELECT officeid, rdate
FROM dbo.mytable
Where OfficeID   = OfficeID
  AND YEAR(h.rDate) = @year
  AND MONTH(h.rDate) BETWEEN 1 AND 4

La requête ci-dessus n'est pas un SARG ( Search Argument) en raison de l'utilisation de fuctions MONTH y YEAR en Where clause . Cela conduit Index scan pendant stored procedure l'exécution. Existe-t-il un moyen de réécrire la requête ci-dessus pour traiter la logique ci-dessus (sans function )

(P.S : rdate es datetime type de données et @year es INT type de données)

5voto

TheGameiswar Points 21

Utiliser des valeurs pseudo..

Cette fonction ci-dessous est SARGABLE(mais sera longue) ,car <a href="https://connect.microsoft.com/SQLServer/feedback/details/526431/make-more-functions-sargable" rel="nofollow">CAST( DATETIME to DATE) is SARAGABLE</a> L'indice sera donc utilisé.

Exemple :

Cast(h.rDate as DATE) 
between datefromparts(@year,01,01) 
 and datefromparts(@year,04,30)

2voto

Robert Columbia Points 5553

Utilisez des comparaisons de plages de dates. Par exemple,

 SELECT officeid, rdate
    FROM dbo.mytable
    Where OfficeID   = OfficeID
    --Filter by dates that are between January 1st, midnight, inclusive, and
    --May 1st, exclusive, in the desired year
    AND h.rDate >= Convert(DateTime,'1/1/' + Convert(VarChar(4),@year))
    AND h.rDate < Convert(DateTime,'5/1/' + Convert(VarChar(4),@year))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X