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 :

Performance machin is null or coalesce(machin,'')=''


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut [resolu]Performance machin is null or coalesce(machin,'')=''
    Bonjour,
    Un collège m'a dit qu'il avait entendu dire que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if coalesce( @mavariable,'')=''
    était plus rapide que J'ai des doutes?
    Qu'en pensez-vous?

    De même non plus dans du Transact SQL mais dans une requète, quel est le plus performant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ...
    Where COALESCE(MON_CHAMP,'')=''
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ...
    Where MON_CHAMP is null
    Personnellement je trouve MON_CHAMP is null plus lisible (compréhensible par un être humain, mais est-ce moins rapide pour la machine.

    Et question identique avec des dates
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE COALESCE(MON_CHAMP_DATE,'1900-01-01')='1900-01-01'
    Performance ou pas, pour l'instant j'ai viré les coalesce et mis des is null à la place, mais j'aimerai savoir si mon collègue a raison, malgré tout.
    Soazig

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    J'aime beaucoup les entendu dire....

    Sur le plan général il faut savoir que dès qu'une fonction est utilisée alors le moteur SQL ne peut pas utiliser d'index. Autrement dit, entre COALESCE et IS NULL, la différence est fondamentale... s'il y a un index. Sinon elle reste marginale.

    Démontration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE T_NULL
    (COLONNE  uniqueidentifier);
     
    DECLARE @I INT
    SET @I = 0
    WHILE @I < 10000
    BEGIN
       IF @I % 99 = 0
          INSERT INTO T_NULL VALUES (NULL)
       ELSE
          INSERt INTO T_NULL SELECT NEWID()
       SET @I = @I + 1
    END
    Auditons les requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SET STATISTICS IO ON
     
    SELECT *
    FROM   T_NULL
    WHERE  COLONNE IS NULL
     
    --Table 'T_NULL'. Compte d'analyses 1, lectures logiques 33, lectures physiques 0, lectures anticipées 0.
     
    SELECT *
    FROM   T_NULL
    WHERE  COALESCE(COLONNE, 0xD97DD43966764886A1ADD3CE91F737B9) = 0xD97DD43966764886A1ADD3CE91F737B9
     
    --Table 'T_NULL'. Compte d'analyses 1, lectures logiques 33, lectures physiques 0, lectures anticipées 0.
    Normal pas d'index => lectures identiques

    Plaçons un index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX X ON T_NULL (COLONNE);
    Auditons les mêmes requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
    FROM   T_NULL
    WHERE  COLONNE IS NULL
     
    -- Table 'T_NULL'. Compte d'analyses 1, lectures logiques 2, lectures physiques 0, lectures anticipées 0.
     
    SELECT *
    FROM   T_NULL
    WHERE  COALESCE(COLONNE, 0xD97DD43966764886A1ADD3CE91F737B9) = 0xD97DD43966764886A1ADD3CE91F737B9
     
    -- Table 'T_NULL'. Compte d'analyses 1, lectures logiques 39, lectures physiques 0, lectures anticipées 0.
    CQFD

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

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Merci SQLPro,
    J'avais aussi apprécié le j'ai entendu dire, et comme je n'aime pas les bruits de couloirs, j'ai tenté les bruits de forums :-).
    Tu m'as confirmé ce qu'il me semblait
    Merci bien
    Soazig

  4. #4
    J1
    J1 est déconnecté
    Membre expérimenté Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Par défaut
    Bonjour,

    outre la question des performances, on notera que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT ...
    WHERE COALESCE(MON_CHAMP,'')=''
    ne correspond pas à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT ...
    WHERE MON_CHAMP IS NULL
    mais à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT ...
    WHERE MON_CHAMP IS NULL OR MON_CHAMP=''

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Oui j'avais bien remarqué la nuance.
    Merci
    Soazig

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/06/2015, 08h24
  2. Réponses: 15
    Dernier message: 27/01/2011, 13h33
  3. Réponses: 3
    Dernier message: 04/08/2009, 17h26
  4. Problème de Null et COALESCE
    Par mimosa21 dans le forum IHM
    Réponses: 3
    Dernier message: 04/11/2008, 06h45
  5. Réponses: 0
    Dernier message: 07/12/2007, 13h12

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