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 :

[SQL 2000] Optimisation sur Jointure ou clause Where alternative


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut [SQL 2000] Optimisation sur Jointure ou clause Where alternative
    Salut

    Je suis face à un souci d'optimisation et je pense être au bout de mes compétences SQL. En fin de topic je mets mon code de requête.

    Cette requête complexe est destinée à finir dans une Fonction Tabulaire, ce que j'ai trouvé de plus perfoamrnt en utilisation pour l'instant. Je me pose tout de même la question de l'opportunité d'une procédure stockée. L'idée étant de récupérer une table à la fin avec 5 champs, ni plus, ni moins.

    Le point de d épart est le tuto (super bien foutu) de SQLPro, sur la gestion d'arbre intervalaire. Dans la table j'ai mis tout le découpage géographique de la France sur 5 niveaux : Pays, Région, Département, Arrondissment et Ville

    Mon idée, maintenant est d'envoyer en paramettre l'Id du découpage qui m'interresse et de récupérer tous ces éléments (la finalité c'est de nourrir un TreeView sur un site Internet en .NET)

    Le truc qui coince c'est que je n'ai pas trouvé d'autre moyen que le CASE sur la clause WHERE pour dire que si le découpage est un Département faut pointer sur la joiture N3 pour remplir correctement la table.

    Pour l'instant je m'aperçois d'un truc simple : il me faut 19-20 secondes pour éxécuter la requête, peu importe le nomre de ligne qu'elle remonte. C'est trop long, surtout pour du NET à la finale.

    Alors soit j'arrive à trouver un moyen d'optimiser les jointures, soit je trouve une autre moyen de définir la clause WHERE.
    En tout cas, je coince, je sais pas comment faire.

    Détail que je rappelle, cela vient du tuto de SQLPro, donc j'ai passé la construction de table et l'index de la table aussi.

    Merci pour votre aide.

    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
     
    DECLARE @idBase INT
    SET @idBase = 203
    DECLARE @tableID TABLE (Niv1 VARCHAR(100), Niv2 VARCHAR(100), Niv3 VARCHAR(100), 
    	Niv4 VARCHAR(100), Niv5 VARCHAR(100))
    DECLARE @Nivo INT
    SET @Nivo = (SELECT NMC_NIVEAU FROM T_NOMENCLATURE_NMC WHERE NMC_ID = @idBase)
    INSERT @tableID
    SELECT 
    RTRIM(ISNULL(N1.NMC_LIBELLE,'')) AS Niv1, 
    RTRIM(ISNULL(N2.NMC_LIBELLE,'')) AS Niv2, 
    RTRIM(ISNULL(N3.NMC_LIBELLE,'')) AS Niv3, 
    RTRIM(ISNULL(N4.NMC_LIBELLE,'')) AS Niv4, 
    RTRIM(ISNULL(N5.NMC_LIBELLE,'')) AS Niv5 
    FROM T_NOMENCLATURE_NMC N1
    LEFT JOIN T_NOMENCLATURE_NMC N2 ON 
    	N2.NMC_BG > N1.NMC_BG AND N2.NMC_BD < N1.NMC_BD AND N2.NMC_NIVEAU = N1.NMC_NIVEAU + 1
    LEFT JOIN T_NOMENCLATURE_NMC N3 ON 
    	N3.NMC_BG > N2.NMC_BG AND N3.NMC_BD < N2.NMC_BD AND N3.NMC_NIVEAU = N2.NMC_NIVEAU + 1
    LEFT JOIN T_NOMENCLATURE_NMC N4 ON 
    	N4.NMC_BG > N3.NMC_BG AND N4.NMC_BD < N3.NMC_BD AND N4.NMC_NIVEAU = N3.NMC_NIVEAU + 1
    LEFT JOIN T_NOMENCLATURE_NMC N5 ON 
    	N5.NMC_BG > N4.NMC_BG AND N5.NMC_BD < N4.NMC_BD AND N5.NMC_NIVEAU = N4.NMC_NIVEAU + 1
    WHERE  @idBase = 
    CASE @Nivo
    	WHEN 1 THEN N1.NMC_ID-- = @idBase
    	WHEN 2 THEN N2.NMC_ID-- = @idBase
    	WHEN 3 THEN N3.NMC_ID-- = @idBase
    	WHEN 4 THEN N4.NMC_ID-- = @idBase
    	WHEN 5 THEN N5.NMC_ID-- = @idBase
    END
     
    ORDER BY Niv1, Niv2, Niv3, Niv4, Niv5
     
    SELECT * FROM @tableID

  2. #2
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    ça serait si balaise que ça à optimiser pour que personne ne voit comment faire ?

    Allez, y a bien un crack de SQL qui va passer par là, non ?

Discussions similaires

  1. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  2. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  3. [SQL] Comment ne pas exécuter une clause WHERE si une var est nulle
    Par charlysquare dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/05/2006, 21h12
  4. Pb création instance SQL 2000 + SP3a sur windows 2003 server
    Par luxans dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/03/2006, 17h05
  5. INNER JOIN ... ON ... ou jointure dans clause where
    Par schmur1 dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 28/06/2005, 09h16

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