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 :

Problème requête après migration vers 2008


Sujet :

Développement SQL Server

  1. #1
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut Problème requête après migration vers 2008
    Bonjour,


    Nous venons de migrer un SqlServer 2000 vers 2008 R2.
    Dans une appli, j'ai la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select distinct
        u.id_badge as badge,
        u.id_user,
        u.password,                                 
        case when p.num_vehi = 'MANA' then '9999' else p.num_vehi end as num_vehi
    from vRESUsersGlob u
        inner join acc_accespompe p on u.code_chauffeur = p.p_code                                                    
        inner join acc_vehicule v on (case when p.num_vehi = 'MANA' then '9999' else p.num_vehi end) = v.num
    where u.id_badge is not null
        and isnull(u.statut,'')=''                                 
        and u.password is not null
        and v.carburant <> 'NE'
        and p.borne_03 = 'A'
    Cette requête fonctionnait très bien avec SQLServer 2000 (à peine 2 à 3 secondes), mais depuis la migration, il faut plus de 3 minutes pour obtenir les quelques 500 lignes de résultat.

    Pour info, "vRESUsersGlob" est une vue qui pointe sur plusieurs serveurs liés.

    Après quelques recherches et tentatives, j'ai pu isoler la ligne qui posait problème, dans la clause WHERE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and isnull(u.statut,'')=''
    Si je remplace cette ligne par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and coalesce(u.statut,'')=''
    alors ça ne prend de nouveau plus que quelques secondes...

    Quelqu'un aurait-il une explication logique à ce phénomène ?

    Merci.

  2. #2
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Outre le fait que je penche plus pour l'utilisation de COALESCE() que de ISNULL() parce que la première est ANSI, je ne vois pas pourquoi vous auriez une telle différence ...
    Est-ce que si vous ré-exécutez la requête avec ISNULL() après l'avoir exécutée avec COALESCE() vous obtenez le résultat en quelques secondes ?
    Si ce n'est pas le cas, pouvez-vous poster les plan d'exécution réels de chacune des deux requêtes ? (CTRL + M avant l'exécution de celles-ci).

    @++

  3. #3
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Bonjour,

    Non rien ne change si j'exécute la requête avec Coalesce avant celle avec IsNull.
    Voici les plans d'exécution réels.
    C'est vrai qu'il sont relativement différents, mais je ne comprends pas pourquoi... et je n'aime pas ne pas comprendre
    Merci.
    Fichiers attachés Fichiers attachés

  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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Pouvez-vous donnez la définition et les index de la table ou de la vue vRESUsersGlob ?

    @++

  5. #5
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    CREATE view [dbo].[vRESUsersGlob]
    as
    -- Serveur local
    select cast(u.id_user as varchar(8)) collate sql_latin1_general_cp1_ci_ai as id_user, 
           u.nom + ' ' + u.prenom collate sql_latin1_general_cp1_ci_ai as fullname,
           u.statut collate sql_latin1_general_cp1_ci_ai as statut,
           u.password collate sql_latin1_general_cp1_ci_ai as password,
           u.dt_print_doc,
           u.dt_retour_doc,
           u.code_chauffeur collate sql_latin1_general_cp1_ci_ai as code_chauffeur,
           u.badge collate sql_latin1_general_cp1_ci_ai as id_badge
    from acc_user u 
    where u.badge is not null
     
    union
     
    select v.id_user collate sql_latin1_general_cp1_ci_ai,
           v.fullname collate sql_latin1_general_cp1_ci_ai,
           v.statut collate sql_latin1_general_cp1_ci_ai,
           v.password collate sql_latin1_general_cp1_ci_ai,
           h.dt_print_doc,
           h.dt_retour_doc,
           v.code_chauffeur collate sql_latin1_general_cp1_ci_ai,
           h.id_badge collate sql_latin1_general_cp1_ci_ai
    from vrespropriobadge v inner join res_histobadge h 
      on v.code = case when v.type_code = 'I' then h.int_code
                       when v.type_code = 'E' then h.ext_code
                       when v.type_code = 'T' then h.tmp_code
                  end and (h.date_fin is null or h.date_fin > getdate())
     
    union
    -- Serveurs distants
    select v.id_user collate sql_latin1_general_cp1_ci_ai,
           v.fullname collate sql_latin1_general_cp1_ci_ai,
           v.statut collate sql_latin1_general_cp1_ci_ai,
           v.password collate sql_latin1_general_cp1_ci_ai,
           h.dt_print_doc,
           h.dt_retour_doc,
           v.code_chauffeur collate sql_latin1_general_cp1_ci_ai,
           h.id_badge collate sql_latin1_general_cp1_ci_ai
    from [10.21.1.35].DataSQL.dbo.vrespropriobadge v inner join [10.21.1.35].DataSQL.dbo.res_histobadge h 
      on v.code = case when v.type_code = 'I' then h.int_code
                       when v.type_code = 'E' then h.ext_code
                       when v.type_code = 'T' then h.tmp_code
                  end and (h.date_fin is null or h.date_fin > getdate())
     
    union
     
    select v.id_user collate sql_latin1_general_cp1_ci_ai,
           v.fullname collate sql_latin1_general_cp1_ci_ai,
           v.statut collate sql_latin1_general_cp1_ci_ai,
           v.password collate sql_latin1_general_cp1_ci_ai,
           h.dt_print_doc,
           h.dt_retour_doc,
           v.code_chauffeur collate sql_latin1_general_cp1_ci_ai,
           h.id_badge collate sql_latin1_general_cp1_ci_ai
    from [10.2.1.32].DataSQL.dbo.vrespropriobadge v inner join [10.2.1.32].DataSQL.dbo.res_histobadge h 
      on v.code = case when v.type_code = 'I' then h.int_code
                       when v.type_code = 'E' then h.ext_code
                       when v.type_code = 'T' then h.tmp_code
                  end and (h.date_fin is null or h.date_fin > getdate())
    GO

Discussions similaires

  1. Problème connexion internet après migration vers 14.04
    Par thecrazydonut dans le forum Linux
    Réponses: 10
    Dernier message: 02/10/2014, 00h54
  2. Tempdb lent après une migration vers 2008 R2
    Par Philippe Robert dans le forum MS SQL Server
    Réponses: 25
    Dernier message: 29/09/2011, 12h23
  3. [MySQL] Problème requête après MAJ serveur
    Par ingeniomatique dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/03/2008, 14h57
  4. [cvs2svn] Problème checkout après migration
    Par jerzy59 dans le forum Subversion
    Réponses: 5
    Dernier message: 07/01/2008, 11h33
  5. Problème Fireboard depuis migration vers OVH
    Par Invité1 dans le forum OVH
    Réponses: 1
    Dernier message: 25/08/2007, 21h20

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