2011-01-11 6 views
0

que je dois faire l'accord sur cette sp:Quel est le problème avec cette procédure stockée?

alter PROCEDURE Gaming.usp_DB_GetGameResultsByDateTime 
(@FromDateTime AS DATETIME2(7) = null , 
@ToDateTime AS DATETIME2(7) = null) 
AS 
    DECLARE @FromDateTime_Actual AS DATETIME2(7) , 
      @ToDateTime_Actual AS DATETIME2(7); 
    SET @FromDateTime_Actual = ISNULL(@FromDateTime, DATEADD (DAY, -1, SYSDATETIME())); 
    SET @ToDateTime_Actual = ISNULL (@ToDateTime , SYSDATETIME()); 

    SELECT Id, GameTypeId, PlayerId, 
      BetAmount, Profit, 
      DateAndTime 
    FROM Gaming.GameResults 
    WHERE DateAndTime >= @FromDateTime_Actual 
    AND DateAndTime < @ToDateTime_Actual 
    ORDER BY DateAndTime ASC; 
GO 

Quel est le problème avec cette procédure stockée? Comment réécrireiez-vous cette procédure stockée?

+1

Quels sont les problèmes que vous rencontrez avec elle? Cela semble assez simple. Si c'est la performance, assurez-vous que vous avez des index sur la colonne DateAndTime ... – JNK

+0

Quels problèmes avez-vous besoin de réglage? –

+0

salut, j'avais index sur le dateandtime. Je pense que le sp recompile dans evrey courir parce que c'est worte? Quelqu'un pense comme moi? – dani

Répondre

0

Basé sur ce que vous avez fourni, le proc est assez simple. Si vous avez des problèmes de performances, assurez-vous d'avoir un index sur DateAndTime car tout votre filtrage est sur ce champ.

0

Attend marchandises à moi, si je pourrais faire

WHERE DateAndTime between @FromDateTime_Actual AND @ToDateTime_Actual 

mais je m'y attendais pas à affecter les performances

Si vous cherchez à faire des performances plus rapides, vous devriez probablement envisager de regarder vos index par exemple DateAndTime pourrait être un bon endroit pour commencer.

Après cela, vous aurez besoin de regarder des articles Perforamnce Conseils like this one

Comme Quassnoi noté, BETWEEN est inclusif qui change < @FromDateTime_Actual à < = @FromDateTime_Actual. Si vous voulez vraiment qu'il ne soit pas inclusif et que vous voulez vous BETWEEN vous pouvez modifier la façon dont vous définissez @ToDateTime_Actual pour que cela se produise.

+2

'BETWEEN' est inclusif alors que la requête de @ op ne l'est pas. – Quassnoi

+0

Vous ne bénéficiez pas non plus de l'avantage d'utiliser 'BETWEEN' – super9

+1

@Nai: c'est une nouvelle pour moi. Soin de citer une source –

2

Il n'y a rien de mal à cette procédure stockée.

Vous pouvez faire un peu plus facile à lire en se débarrassant des variables:

ALTER PROCEDURE 
     Gaming.usp_DB_GetGameResultsByDateTime 
     (
     @FromDateTime AS DATETIME2(7) = NULL , 
     @ToDateTime AS DATETIME2(7) = NULL 
     ) 
AS 
DECLARE 
     SELECT Id, GameTypeId, PlayerId, BetAmount, Profit, DateAndTime 
     FROM Gaming.GameResults 
     WHERE DateAndTime >= ISNULL (@FromDateTime , DATEADD (DAY , -1 , SYSDATETIME())) 
       AND DateAndTime < ISNULL (@ToDateTime , SYSDATETIME()) 
     ORDER BY 
       DateAndTime ASC 
GO 

et plus efficace en créant un index sur GameResults (DateAndTime)

+0

ok, mais de cette façon est d'économiser les coûts de recompilation pour une requête, même si elle fonctionne avec des paramètres différentiels? ou y a-t-il un moyen d'enregistrer le plan d'exécution pour toutes les exécutions? – dani

+0

@dani: 'SQL Server' mettra en cache le plan d'exécution de la procédure à moins qu'il ne soit déclaré avec' WITH RECOMPILE'. – Quassnoi

Questions connexes