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
Partager