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 :

Utilisation de ISNULL(,) pour jointure non systématique


Sujet :

Développement SQL Server

  1. #1
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut Utilisation de ISNULL(,) pour jointure non systématique
    Bonjour,
    Je ne sais pas si mon titre est très clair amis je vais m'expliquer au mieux.
    pour une PS, j'ai un paramètre @CodeAction (correspondant à une valeur d'un champs de la table Action) qui peut arriver NULL.
    Je souhaite :
    - si le paramètre est NULL, ne pas le prendre en compte
    - sinon faire le croisement.

    L'idée est donc d'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE Action.CodeAction = ISNULL(@CodeAction, Action.CodeAction)
    Dans ce cas il fait ce que je demande.
    Le problème est que cette table Action est très lourde et le temps de traitement en souffre.

    la solution rustine : décomposer le select, mais ce n'est vraiemt pas bon à maintenir..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IF @CodeAction IS NOT NULL
    SELECT ...
    FROM ...
    WHERE act.CodeAction = @CodeAction
     
    ELSE
    SELECT ...
    FROM ...
    WHERE <rien>
    Niveau maintenance ça fait vraiment dégueulasse mais au moins c'est beaucoup plus rapide.

    Merci pour vos conseils.
    Alexandre Chemla - Consultant MS BI chez Masao

  2. #2
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Après quelques essais et recherches supplémentaires,
    j'ai remplacé le ISNULL par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    act.CodeAction = COALESCE(@CodeAction, @CodeAction, act.CodeAction)
    Cela semble s'executer beaucoup plus vite que le ISNULL (qui commencait à prendre plus de 15min.... là je suis plus de l'ordre des 3s.

    Est-ce normal un tel gain de temps ou est ce qu'il y a quelque chose de mauvaise qui se ballade sur cette base ?

    Merci
    Alexandre Chemla - Consultant MS BI chez Masao

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 775
    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 775
    Points : 52 747
    Points
    52 747
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    act.CodeAction = COALESCE(@CodeAction, act.CodeAction)
    suffira !

    Evicemment que cela va plus vite :
    Avec un OR aucun index ne peut être activé.
    Avec cette condition votre prédicat devient "sargable" et donc le moteur peut utiliser un index.

    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/ * * * * *

  4. #4
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    EUh... je n'ai aps tout compris à l'explication.

    Ok pour le OR, je ne le savais pas mais c'est bon à savoir : utiliser le moins possible.
    Par contre je n'ai pas compris comment le prédicat devient sargable avec le COALESCE et pas avec le ISNULL ?

    Merci
    Alexandre Chemla - Consultant MS BI chez Masao

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Pour qu'un prédicat soit Sargable (Search Argument Able) donc indexable, il faut que les opérandes soient de même format
    COALESCE le permet puisque cette fonction prend la première valeur non nulle de la liste

  6. #6
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    Quel sont les types exactes de ta variable @CodeAction et colonne act.CodeAction ?

    Il y a en effet une différence entre ISNULL et COALESCE sur la manière de traiter les types de données . COALESCE prendra le type avec la plus haute précédence alors que ISNULL prendra le premier type venu.

    Tu peux fournir les 2 plans d'exécutions dans ton cas ?

    ++

Discussions similaires

  1. Réponses: 11
    Dernier message: 07/07/2008, 11h07

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