2017-10-06 6 views
1

Pourquoi une telle différence énorme dans la performance si je mets mes dates dans la clause WHERE (première requête) ou si je mets mêmes dates en tant que paramètres (deuxième requête)dates codées dur dans la clause WHERE donne des performances plus rapides alors même dates en tant que paramètres?

--------/* Execution time 3 sec*/ 
    select 
      tblNoteDiaries.DueDate, 
      col2, 
      col3 
    from MyTable 
    where CAST(tblNoteDiaries.DueDate as date) <= cast(getdate()as date) and cast(tblNoteDiaries.DueDate as date) >= CAST('2017-09-29' as DATE) 

--------/* Execution time 10 sec*/  
    declare  @DateFrom datetime = '2017-09-29', 
       @DateTo datetime = '2017-10-05' 
    select 
      tblNoteDiaries.DueDate, 
      col2, 
      col3 
    from MyTable 
    where CAST(tblNoteDiaries.DueDate as date) >= @DateFrom and cast(tblNoteDiaries.DueDate as date) <= @DateTo 

J'ai besoin de cette requête comme une procédure stockée, quelle serait la meilleure approche pour utiliser les paramètres de date sans dégradation des performances?

+1

voyez-vous une différence dans le plan d'exécution? – FLICKER

+1

Renvoi de paramètre le plus probable. Le plan d'exécution vous donnera un indice. –

Répondre

3

Je simulé sur ma base de données en utilisant des requêtes ci-dessous

select sum(PrinBal) 
from fpc 
where SnapshotDt >= '2017-06-01' and SnapshotDt <= '2017-06-30' 
go 

declare @sd date = '2017-06-01' 
declare @ed date = '2017-06-30' 
select sum(PrinBal) 
from fpc 
where SnapshotDt >= @sd and SnapshotDt <= @ed 
go 

et vérifié plan d'exécution. il était de 48% pour la première requête et de 52% pour la seconde.

Puis j'ajouté option(recompile) à la deuxième requête, puis les deux ont pris exactement le même pourcentage

declare @sd date = '2017-06-01' 
declare @ed date = '2017-06-30' 
select sum(PrinBal) 
from fpc 
where SnapshotDt >= @sd and SnapshotDt <= @ed 
option(recompile) 
go 

Alors que Nick, dit, il est paramètre renifler.

Vous pouvez vous débarrasser du paramètre renifler à l'aide des statistiques mises à jour ou en utilisant l'option RECOMPILE pour vos requêtes et procédures stockées.

+0

Génial! Merci beaucoup !!! – Oleg

0

Parce que vos variables sont déclarées comme datetime. Cela a une plus haute priorité de type de données. Donc, vous convertissez votre colonne DueDate-date explicitement, puis convertir à nouveau à datetime.

Utilisez date pour vos variables, et vous devriez voir les mêmes performances. Encore mieux, ne pas CAST votre colonne de date si le type est déjà correct.

+0

J'ai testé avec les deux types date et date, mais je ne vois aucune différence. – FLICKER