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

MS SQL Server Discussion :

Ecriture requête et performance


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Février 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 1
    Par défaut Ecriture requête et performance
    Bonjour,

    Ma requête initiale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT monchamp 
    FROM matable
    WHERE madate1=madate2 OR (madate1 is null AND madate2 is NULL)
    Ma requête modifiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT monchamp
    FROM matable
    WHERE ISNULL(madate1,GETDATE())=ISNULL(madate2,GETDATE())
    Actuellement les deux requêtes me retournent le même résultat.

    Question 1 : Est-il possible que lorsque madate1 et madate2 sont nulles, le test suivant soit FAUX ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ISNULL(madate1,GETDATE())=ISNULL(madate2,GETDATE())
    Question 2 : Sur ma base, la seconde requête semble être plus rapide. Puis-je généraliser cette écriture pour améliorer les performances ?

    Merci pour vos réponses.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour

    Pour la question 1, la réponse est non.
    Si madate1 est null, et madate2 est null, alors la comparaison revient à :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GETDATE() = GETDATE()
    ce qui sera toujours vrai
    (la fonction GETDATE() est évaluée une seule fois par le moteur, et aura toujours la même valeur, même si ta requete mets plusieurs secondes à s'exécuter, car je crois que c'était le fond de ta question )


    Pour la seconde question, le fait d'utiliser OR dans ton filtre empêche le le moteur de tirer parti des index.
    De façon générale, il vaut mieux écrire :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT macolonne
    FROM matable
    WHERE UneColonne = X
    UNION ALL
    SELECT macolonne
    FROM matable
    WHERE UneColonne = Y
    plutôt que
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT macolonne
    FROM matable
    WHERE UneColonne = X
    OR UneColonne = Y

  3. #3
    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 aieeeuuuuu Voir le message
    Pour la seconde question, le fait d'utiliser OR dans ton filtre empêche le le moteur de tirer parti des index.
    Vous généralisez un peu trop quand même, ce que vous dites est vrai sur des conditions complexes combinées par des OR, mais sûrement pas dans le cas de figure que vous exposez où l'emploi du OR (ou d'un IN) se justifie pleinement.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 52
    Par défaut
    Bonjour,

    utiliser l'opérateur OR n'interdit en rien de solliciter un index.
    Une simple consultation du plan d'exécution de vos requête pourra vous en convaincre.

    Je vous conseille de vous documenter :
    1- structure des indexes
    2- fonctionnement de l'optimiseur SQL Server

    Le fonctionnement est bien compliqué. Aussi optimiser une requête ne dois pas relever du hasard.


    @+

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Effectivement un OR est souvent "transformé" en UNION ALL automatiquement et de manière transparente par SQL Server, afin de bénéficier des index s'il y en a....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vous généralisez un peu trop quand même, ce que vous dites est vrai sur des conditions complexes combinées par des OR, mais sûrement pas dans le cas de figure que vous exposez où l'emploi du OR (ou d'un IN) se justifie pleinement.
    Oui, vous avez parfaitement raison.
    Surtout qu'en relisant de plus près, dans la requete de chouffe59, il s'agit de comparer deux colonnes de la même table, ma requete engendrera donc même sans doute deux scans de la table...


    Citation Envoyé par zeus Voir le message
    Bonjour,
    Le fonctionnement est bien compliqué. Aussi optimiser une requête ne dois pas relever du hasard.
    Ha bon ??? j'ai toujours procédé ainsi pourtant
    "plus on rate, plus on a de chance de réussir..."

    Merci pour le scoop en tout cas !

    @chouffe59 :
    Qu'est-ce qui te fait dire que ta deuxième requete est plus rapide ? Si tu les exécutes l'une après l'autre, il est possible que la deuxième requête "semble" plus rapide car les données ont été mises en cache lors de la première, ce qui fausse les résultats si tu ne te bases que sur le temps de réponse de la requête...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 52
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    [...] en relisant de plus près, dans la requete de chouffe59, il s'agit de comparer deux colonnes de la même table, ma requete engendrera donc même sans doute deux scans de la table...
    A nouveau, je ne suis pas d'accord avec ce que vous dites
    L'éventualité d'un balayage d'index n'est pas à éliminer.
    Il n'y aura pas forcément de table scan.
    Tous est fonction de l'indexation, de l'état des statistique calculées, de la volumétrie, etc.
    Par exemple sur une table de très faible volumétrie, le table scan est souvent privilégié à un index scan. Ce n'est qu'une question de coût et de choix de l'optimiseur.

    @+

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/04/2009, 14h33
  2. Aide sur ecriture requête
    Par bruce207 dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/08/2008, 13h38
  3. [DB2]requête et performence
    Par Tan dans le forum DB2
    Réponses: 8
    Dernier message: 18/03/2008, 13h43
  4. Requêtes et performances.
    Par Empty_body dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/10/2007, 09h34
  5. Sous requête et performance. Un cas d'école ?
    Par asaintleger dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/11/2006, 11h04

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