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] Bizarrerie de variable


Sujet :

MS SQL Server

  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] Bizarrerie de variable
    Bonjour

    J'ai fait une requête en utilisant une variable et ça ne fonctionne aps , enfin ça mets beaucoup trop de temps à s'exécuter. Mais la chose que je ne comrpdns pas c'est que quand je mets la valeur elle même la requête tourne en 2 secondes

    Voilà le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	SELECT DISTINCT NMC_ID, NMC_LIBELLE, dbo.IdPere(NMC_ID) AS Parent FROM T_NOMENCLATURE_NMC
    	WHERE NMC_ID in (
    	SELECT dbo.idPereNiv(NMC_ID,2 + 1)
    	FROM Opila_Zone_Contenu ZC
    	INNER JOIN T_NOMENCLATURE_NMC N ON N.NMC_ID = ZC.Id_Decoupage
    	WHERE id_zone = @idzone AND Effet = 0 AND N.NMC_NIVEAU > @Niv)
    Le 2 en rouge est remplacé par le Variable @Niv, la même qu'à la fin.
    Et donc, comme je dsiais, avec la valeur 2 secondes, avec la variable, au moins 2 minutes car j'ai arrêté.

    Pouvez vous m'aider ?

    MErci

  2. #2
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    Si c'est dans une procédure stockée, essaie de la relancer avec l'option WITH RECOMPILE

  3. #3
    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
    MErci pour ton aide.
    Non, c'est dans une rquête simple avec un DECLARE en huat.
    à la fin ça sera dans une FUNCTION

    Tu crois que ça marcherais mieu, directement dedans ?

  4. #4
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Peut-être grâce à une précompilation. Mais je n'avais pas bien regardé ton code. Il y a un problème de performance potentiel. Que font tes fonctions dbo.idPere et dbo.idPereNiv ?

  5. #5
    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
    Elle vont chercher le pere de la zone en question et le Niveau du père de la zone en question selon le deuxième paramettre

    Précision de contexte : il s'agit d'une table de zone géographique faite selon le super tuot de SQLPro avec un arbre intervallaire.

    Dans la requête que j'utilise je remonte une zone de plus haut niveau que la zone en paramettre car, dans le reste de maon développement, cette zone n'a pas de père défini, il faut lui retrouver car elle se sent toute seule à la caisse centrale du magasin.....

    Mais ce qui me scotch le plus c'est le fait de prendre la valeur ou la variable et de ne pas avoir le même temps d'exécution. J'arrive pas à comprendre la différence entre les deux.

  6. #6
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    En utilisant une fonction dans le WHERE qui va chercher dans une table par rapport au contenu d'un colonne, tu tues tes performances. Tu forces SQL Server à entrer dans la fonction pour chaque ligne. N'essaie pas de modulariser ce code : mets le contenu de ta fonction dans ton SELECT, que ce soit en sous-requête ou en jointure.

    Tu régleras tes problèmes ainsi, avec ou sans variable. Peut-être que la fonction doit se recompiler à chaque appel si tu mets une variable, il faudrait le vérifier avec le profiler.

  7. #7
    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
    Mais je n'utilise pas de fonction dans le Where, le l'utilise dans le Select.

    Ou alors tu veux dire que je ne devrais pas utiliser de fonction pour récupérer le Id comme je le fait pour mon IN ?

    Ben moi je veux bien, mais je fais comment pour fabriquer ma requête.
    J'ai pas trouver d'autre moyen. Les jointures j'y arrive pas, je suis toujours à côté.

    L'emmerdement dans cette requête c'est qu'il faut que je récupère un ID de zone selon le niveau de cette zone par rapport à la zone d'entrée.

    Par exemple : dans ma zone j'ai la ville de Vannes et il faut que détermine les département de ma zone. Il faut donc que je récupère l'ID du Morbihan pour l'envoyer.

    Comprends tu mon souci ?

  8. #8
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Mes excuses, c'est une coquille, je voulais bien dire "dans le SELECT", pas dans le WHERE.
    Oui, utiliser une fonction dans le SELECT est très mauvais pour les performances.

    Si tu postes le code de ta fonction, nous t'aidons à réécrire ta requête.

  9. #9
    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
    OK, merci pour ton aide.

    Le code de ma fonction le voici
    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
     
    ALTER   FUNCTION dbo.IdPere(@idBase int)
     
    RETURNS INT AS  
    BEGIN
    DECLARE @valur INT
    SET @valur = 
    (
    SELECT NMC_ID FROM dbo.T_NOMENCLATURE_NMC 
    WHERE NMC_BG < (SELECT NMC_BG FROM dbo.T_NOMENCLATURE_NMC WHERE NMC_ID = @idBase)
    AND NMC_BD > (SELECT NMC_BD FROM dbo.T_NOMENCLATURE_NMC WHERE NMC_ID = @idBase)
    AND NMC_NIVEAU = (SELECT NMC_NIVEAU -1 FROM dbo.T_NOMENCLATURE_NMC WHERE NMC_ID = @idBase)
     
    )
    RETURN @valur
    END
    Encore une fois, la structure de donnée est cele de SQLPro pour son arbre intervallaire. Les données dans la table sont des données géographiques faisant le découpage de la France en Région, Département, Arrondissement et communes.

    Maintenant, sctocher ça, dans la requête de base, ça va être chaud.

    En tout cas merci d'avance pour la peine que vous aller endurer

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/04/2007, 17h27
  2. [SQL SERVER 2000] Problème sqlstring variable server
    Par akrem dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/04/2007, 12h35
  3. [SQL Server 2000] Select from @variable
    Par chorokari dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/12/2006, 12h58
  4. [SQL SERVER 2000] Noms de variables dynamiques
    Par cassoulet dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/09/2004, 11h44
  5. [SQL S 2000] Type de variable ?
    Par Tankian dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/06/2004, 14h03

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