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 :

Vue avec CTE


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut Vue avec CTE
    Je poste ici a cause de la spécificité des CTEs de SQLserver
    J'ai quelques problèmes avec la vue suivante
    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
     
    CREATE VIEW [dbo].[V_DEVPART_ALL_DPT1]
    AS
    WITH Descendants (ID, LVL, NUM)
    AS
    (
    -- Ancre
        SELECT A.DPT_ID, 0 AS LVL, CAST(A.DPT_ORD AS VARCHAR(32)) AS NUM
        FROM T_DEVPART_DPT A 
    	WHERE A.DPT_PID IS NULL
        UNION ALL
    -- Partie Recursive 
        SELECT B.DPT_ID, P.LVL+1 AS LVL, CAST(P.NUM + '-' + CAST(B.DPT_ORD AS VARCHAR(4)) AS VARCHAR(32)) 
        FROM T_DEVPART_DPT B 
    	INNER JOIN Descendants P ON B.DPT_PID = P.ID
    )
    --Utlisation de la cte
    SELECT     
    	A.DPT_ID,
    	T.LVL AS DPT_LVL,
    	T.NUM AS DPT_NUM,
    	A.DEV_ID,
    	A.DPT_PID,
    	A.DPT_ORD,
    	A.DPT_STYPE, 
    	A.DPT_FAMILLE,
    	A.DPT_SFAMILLE,
    	A.DPT_REF,
    	A.DPT_LIBELLE, 
    	A.DPT_QTE,
    	A.DPT_UNITP,
    	B.UPU_QTE,
    	A.DPT_PUA1,
    	A.DPT_PUA2,
    	A.DPT_PUVHF,
    	A.DPT_PUV1,
    	A.DPT_PUVF,
    	A.DPT_MT_AJUST, 
    	A.DPT_NB_HRS_MO,
    	A.DPT_MT_MO,
    	A.DPT_PUA1 * A.DPT_QTE * (1 / B.UPU_QTE) AS DPT_PTA1,
    	A.DPT_PUA2 * A.DPT_QTE * (1 / B.UPU_QTE) AS DPT_PTA2,
    	A.DPT_PUVHF * A.DPT_QTE * (1 / B.UPU_QTE) AS DPT_PTVHF,
    	A.DPT_PUV1 * A.DPT_QTE * (1 / B.UPU_QTE) AS DPT_PTV1,
    	A.DPT_PUVF * A.DPT_QTE * (1 / B.UPU_QTE) AS DPT_PTVF,
    	A.DPT_TEXTCOM,
    	A.DPT_REF_DEEE,
    	A.DPT_CODE_DEEE,
    	A.DPT_UNIT_DEEE, 
    	A.DPT_MT_DEEE
    FROM 
    	T_DEVPART_DPT AS A INNER JOIN Descendants AS T ON (A.DPT_ID = T.ID)
    		LEFT OUTER JOIN T_UNITPU_UPU AS B ON (A.DPT_UNITP = B.UPU_CODE);
    Quand je l'utilise depuis le client ou Management studio avec par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SET STATISTICS IO ON
    SET STATISTICS TIME ON
    select * from V_DEVPART_ALL_DPT1 where DEV_ID = 9470
    alors que la plupart du temps j'obtiens - de 400 ms sur 4500 lignes renvoyées, de temps en temps cela monte à plus de 4 secondes
    comme si la partie récursive s'executait sur l'ensemble de la table avant
    d'etre restreinte par la jointure, je ne sais pas si je me fait bien comprendre,
    sinon pourquoi cette différence
    Bruno Petit

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Salut,

    Pourquoi cette différence ?
    - Surcharge réseau ?
    - Surcharge serveur ?
    - Un ptit lock sur la table ?
    - Les controlleurs disques trop occupés que pour avoir le temps de te retourner tes data...
    - Le cache vient d'être vidé ?
    - ...

    Est ce que l'execution plan varie entre les fois ou tu as tes données en 400ms et celles ou tu les as en 4 secondes ?

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut
    je n'ai pas vérifié tout les points dont tu parle mais à priori
    ce n'est pas un des 5 premiers , je suis seul sur un nouveau serveur
    Le point sur le plan d'exec il faudrait que je m'y penche, depuis Management studio car je ne sais pas comment faire cela depuis mon appli cliente (Ado + delphi)
    En y regardant de plus près la lenteur avec Management studio semble effectivement être réglée en envoyant dans la table des données plus nombreuses (60 000) , bizarement avec juste un set de 5000 lignes j'avais de mauvais résultats
    Bon maintenant une autre chose m'étonne si la requête sur la vue me retourne 15 lignes cela fait 353 ms et 3247 lignes = 517 ms pourquoi aussi peu de différence parce que coté client la requète (process complet ) met environ 600 ms et cela fait trop pour un 15 lignes, dans les 2 as j'ai le même plan , mais la sortie avec
    SET STATISTICS IO ON
    SET STATISTICS TIME ON
    me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (3247*ligne(s) affectée(s))
    Table 'T_UNITPU_UPU'. Nombre d'analyses 1, lectures logiques 6495, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
    Table 'T_DEVPART_DPT'. Nombre d'analyses 13548, lectures logiques 87828, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
    Table 'Worktable'. Nombre d'analyses 2, lectures logiques 81272, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
     
    SQL Server \endash  Temps d'exécution*:
    , Temps UC = 391*ms, temps écoulé = 517*ms.
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (15*ligne(s) affectée(s))
    Table 'T_UNITPU_UPU'. Nombre d'analyses 1, lectures logiques 31, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
    Table 'T_DEVPART_DPT'. Nombre d'analyses 13548, lectures logiques 81364, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
    Table 'Worktable'. Nombre d'analyses 2, lectures logiques 81272, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
     
    SQL Server \endash  Temps d'exécution*:
    , Temps UC = 328*ms, temps écoulé = 353*ms.
    Bruno Petit

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    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 774
    Points : 52 744
    Points
    52 744
    Billets dans le blog
    5
    Par défaut
    le temps écoulé n'a aucun intérêt car il prend en compte toute ce qui se passe en dehors de SQL Server, par exemple le déclenchement d'un envoi de mail ou le passage de la souris sur l'écran. Seul le temps CPU est intéressant. Mais pas très révélateur car il eput lui aussi différer sensiblement par exemple si le serveur est chargé et décide d'interrompre le processus (time sharing) donc il y aura aussi les temps de chargement/déchargement... Le plus intéressant est d'abord le nombre de pages de données scrutées.

    SET STATISTICS IO ON

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

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut
    Bonjour

    Ce nombre de page scrutées, s'agit il du nombre de lecture logique; ce qui m'étonne dans mon cas c'est qu'il est pratiquement le même sur la table T_DEVPART_DPT, que la requète sur la vue ramène 15 ou 3200 lignes, ce qui me fait penser que ma condition
    WHERE DEV_ID = NUM_devis1 (16 lignes)
    WHERE DEV_ID = NUM_devis2 (3200 lignes)
    n'agit pas sur le travail total de ma requète
    Je ne connait pas le fonctionnement interne du SGBD mais il semble normal de penser que le travail total est nettement inférieur avec 15 lignes
    Bruno Petit

Discussions similaires

  1. Vues avec des "case"
    Par jfphan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/01/2005, 12h17
  2. Création vue avec test d'existence
    Par yan77 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/12/2004, 11h44
  3. [FB1.5]Vue avec jointure sur tables ?
    Par Sitting Bull dans le forum SQL
    Réponses: 2
    Dernier message: 07/12/2004, 17h07
  4. comment tourner la vue avec la souris
    Par delfare dans le forum OpenGL
    Réponses: 13
    Dernier message: 12/09/2004, 17h44
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 13h57

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