IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Plus rapide entre Year et Between


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Par défaut Plus rapide entre Year et Between
    Hello,

    je me pose une question: quelle est la meilleure synthaxe entre un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT News.* FROM News WHERE Year(StartDate) = 2009
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT News.* FROM News WHERE StartDate BETWEEN '2009-01-01' AND '2009-12-31'

    Je me dis que la premiere solution est peut etre moins performante car elle doit executer une fonction sur chaque record??

    Merci pour vos reponses

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    La solution 1 sera mois performante que la solution 2 parce qu'elle utilise dans la restriction une fonction (de date ici). Elle ne pourra pas bénéficier d'une éventuelle recherche d'index qui existerait sur votre champ StartDate.

    Une autre orientation serait de créer une colonne calculée persitente en se basant sur Year(StartDate) et d'indexer cette colonne (nommée par exemple year_date). A ce moment là vous pourrez utiliser la requête de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT News.* FROM News WHERE year_date = 2009
    Vous pourrez tirer bénéfice de votre index.

    ++

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Par défaut
    Merci pour cette reponse tres complete. Je ne connaissais pas ce type de champ . Je vais regarder cela de plus pres.

    Ceci dit je me dit qu'utiliser un between me permet d'avoir une stored procedure plus souple en me permettant de modifier la duree de la periode a tout moment depuis mon code.

    Encore merci

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Comme vous l'a conseillé mikedavem, pour ajouter une telle colonne à votre table :

    SELECT News.* FROM News WHERE Year(StartDate) = 2009

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE News
    ADD Annee AS(YEAR(StartDate)) PERSISTED NOT NULL
    Et pour créer l'index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE INDEX IX_News_Annee
    ON dbo.News (Annee)
    Maintenant votre remarque par rapport aux traitements que vous avez à faire est bonne.
    Vous pouvez, pour disposer d'encore plus de souplesse, créer une table de dates

    Cela vous permettrait par la suite d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT N.*
    FROM dbo.News AS N
    JOIN dbo.TbDates AS D
    	ON N.StartDate = D.date
    	AND D.annee = 2009
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BETWEEN '2009-01-01' AND '2009-12-31'
    Vous pouvez directement écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BETWEEN '20090101' AND '20091231'
    C'est le format ISO des dates.

    @++

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Par défaut
    Merci bcp elsuket pour toutes ces precisions et ces exemples qui facilite grandement la comprehension
    C'est vraiment tres interessant tout ca et je me dis qu'avec mes connaissances "basiques" en SQL je passe a cote de pas mal de choses...

    Je vais etudier tout cela en details. Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 07/03/2014, 10h26
  2. Réponses: 9
    Dernier message: 19/06/2006, 15h29
  3. [FB1.5]Quelle est la requete la plus rapide ?
    Par Sitting Bull dans le forum SQL
    Réponses: 4
    Dernier message: 10/12/2004, 13h46
  4. [VB6] timer plus rapide que 1 d'interval
    Par windob dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/02/2004, 00h16
  5. Réponses: 8
    Dernier message: 31/10/2003, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo