Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/09/2011, 11h17   #1
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
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 :
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 :
AND isnull(u.statut,'')=''
Si je remplace cette ligne par
Code :
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.
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 17h57   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
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).

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 09h19   #3
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
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
Type de fichier : zip Plans.zip (23,0 Ko, 2 affichages)
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 15h41   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Pouvez-vous donnez la définition et les index de la table ou de la vue vRESUsersGlob ?

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 16h19   #5
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
Code :
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
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h58.


 
 
 
 
Partenaires

Hébergement Web