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