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 :

[2005] DateTime + Sort = lenteur


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut [2005] DateTime + Sort = lenteur
    Bonjour,

    On entend souvent (à juste titre) que trier des résultats par date n'est pas très performant (même avec un indexe) et devrait être évité.
    Mais je me retrouve dans un cas de figure ou je ne vois pas d'alternative.

    En effet, je dois retrouver le dernier (en terme d'une date clé) enregistrement qui précède un enregistrement définit au moment de la requête.
    Aucun identifiant entier (ou autre) ne me permet de retrouver ce même ordre.

    Est-ce que l'un de vous à déjà trouvé un moyen de faire ce type de recherche de façon plus éfficace que le TOP + ORDER BY ?

    Merci.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    On entend souvent (à juste titre) que trier des résultats par date n'est pas très performant (même avec un indexe) et devrait être évité.
    Ca me paraît faux, une date étant en fait un nombre de jours depuis une date maître :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select getdate() - cast(getdate() as float);
     
    1900-01-01 00:00:00.000
    Ce sera certes plus lent qu'un petit entier, mais loin de la catastrophe que vous avez l'air d'imaginer.

    Citation Envoyé par Sergejack Voir le message
    En effet, je dois retrouver le dernier (en terme d'une date clé) enregistrement qui précède un enregistrement définit au moment de la requête.
    Aucun identifiant entier (ou autre) ne me permet de retrouver ce même ordre.
    C'est même heureux que pour trouver la dernière date vous interrogiez la date ! Un id quelconque ne vous garantirait strictement rien.

    Citation Envoyé par Sergejack Voir le message
    Est-ce que l'un de vous à déjà trouvé un moyen de faire ce type de recherche de façon plus éfficace que le TOP + ORDER BY ?
    Regardez du côté de la fonction analytique row_number(), mais je ne vous garantis pas que ce soit forcément plus rapide que le TOP + ORDER BY, essayez les deux méthodes.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Une requête de ce type ne fonctionnerait-elle pas dans votre cas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT source.mes_colonnes 
    FROM ma_table source
         INNER JOIN (SELECT MAX(date) AS date
                          FROM ma_table
                          WHERE date < date_reference) filter ON source.date = filter.date
    où date_reference correspondrait à la date de l'enregistrement définit au moment de la requête

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    En supprimant mon indexe sur le DateTime, ma requête va plus vite.
    Gain de temps : de l'ordre de 200% sur mes tests !

    @Waldar : En créant une colonne qui correspond au TIMESTAMP casté en INT de la date, et aussi sans index, ma séries de requête passe de 37 secondes à 12 secondes (les requêtes non concernées par ce problème prennent 2 secondes) !!

    @Erwan1978 : Il me faut retrouver l'enregistrement, et non une date (qui par ailleurs ne me permettrait pas d'identifier mon enregistrement*)

    * ligne, pour ceux qu'y fulminent devant la mauvaise terminologie.

    ----


    Par ailleurs, j'ai pu vérifié une idée absurde (et pourtant ça marche !) que j'avais en tête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    				SELECT TOP(1) O.Handicap
    				FROM tHandicaps AS O
    				WHERE O.IdMember = T.IdMember
    				AND O.X < T.EntryDate
    				-- This is way faster than retrieving top row of a sorted view
    				AND NOT EXISTS (
    					SELECT TOP(1) 1
    					FROM tHandicaps AS O2
    					WHERE O2.IdMember = O.IdMember
    					AND O2.X < O.X
    				)
    Moi qui pensais que SQL Server, fesait exactement cela en égard à la clause TOP...

    Gain de temps : de l'ordre de 300% sur mes tests !

    Au total je suis passé de 1:20 à 0:12 (mm:ss)

Discussions similaires

  1. Lenteur sur MS SQL 2005 Std
    Par alexking2005 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/12/2007, 17h07
  2. Lenteur dans VISUAL STUDIO 2005
    Par freud dans le forum Visual Studio
    Réponses: 10
    Dernier message: 17/10/2007, 11h47
  3. Lenteur excessive sur SQL Server 2005
    Par Cerberus26 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 13/02/2007, 15h51
  4. [2.0] Lenteur d'une connection à une base de données SQL Server 2005 Pro
    Par Pilloutou dans le forum Accès aux données
    Réponses: 3
    Dernier message: 09/02/2007, 16h44
  5. [SQL 2005] lenteur TSQL
    Par bferec dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/11/2006, 14h17

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