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

Développement SQL Server Discussion :

[SQL] requete avec where dynamique


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 154
    Points : 62
    Points
    62
    Par défaut [SQL] requete avec where dynamique
    Bonjour à tous, j'ai une question à poser au niveau de la construction de requête dynamique.

    Imaginer une page de liste avec un formulaire de recherche. Selon ce qui est sélectionné dans ce formulaire, on construit notre WHERE.

    On appelle ensuite notre procédure stockée qui fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecexute('SELECT * FROM TOTO WHERE (' + @requete + ')')
    Ca marche très bien. Sauf que ca fou en l'air toute l'optimisation des clés et index de SQL. En effet, a cause du exécute, la requête est recalculé a chaque fois.

    Résultat on se retrouve avec des performances pourris par ce système pourtant bien pratique.

    La seule autre solution consisterais à faire passer à la requête les X paramètres du where et de gruger en faisant qq chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ((toto=@toto or @toto=''))
    Si qq'un voit qq chose de mieux, je suis donc à l'écoute car nous sommes actuellement dans une impasse.

  2. #2
    Nouveau membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2007
    Messages : 34
    Points : 29
    Points
    29
    Par défaut
    Salut

    j'ai peut être une idée.

    On va prendre un exemple comme ca tu me dira si j'ai bien compris ou pas.

    Imaginons un Formulaire de recherche avec deux textbox permettant la recherche d'un membre par nom ou prénom.

    Ta requète va donc attendre deux paramètre.

    @nom et @prenom.

    Il n'est pas obligé de renseigner les deux champs.

    Moi je procederais de la façon suivante.

    Si mon champ nom est vide alors j'afecte -1 a la variable @nom sinon j'affecte la bonne valeur.

    je fais la même chose avec le champ prénom et la variable @prenom.


    Dans ma requète je procède ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM membre
    WHERE (nom = @nom OR @nom = -1)
    AND (prenom = @prenom OR @prenom = -1)

    Peut être il y at'il d'autre solutions, moi je procède ainsi en générale.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 901
    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 901
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Beaucoup plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM membre
    WHERE nom = COALESCE(@nom, nom)
    AND prenom = COALESCE(@prenom, prenom)
    etc...

    A +

  4. #4
    Nouveau membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2007
    Messages : 34
    Points : 29
    Points
    29
    Par défaut
    En effet, la méthode de SqlPro est beaucoup plus simple. Pourquoi n'y ai je jamais pensé ?

    @++

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 154
    Points : 62
    Points
    62
    Par défaut
    La solution en elle même pourrais être bonne. Le problème c'est que l'on appelle la procédure stockée X à partir de plusieurs pages.

    Donc dans la page A on va avoir @nom, @prenom, etc....
    Dans la page B on va avoir @adresse,@ville, etc....

    Bref vous comprenez le soucis, on va vite se retrouver avec 50 champs possibles.

    On ne peut pas s'amuser pour nos 300 procédures stockées à rentrer nos X paramètres possibles (sans compter qu'on peut en ajouter en route)

    Donc ma question est: sql est il capable d'optimiser des requêtes lancées depuis le code vb. j'ai essayer de passer dans requêtes texte, avec des add params, mais ça donne rien de concluant.


    Un autre soucis également avec cette méthode c'est qu'on à des choses plus complexe que de simples =. Du style:

    champ like '%@op'
    ou date beetwin @op and @po
    ou (toto=@op or toto is null)
    etc....

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 901
    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 901
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Une requête dynamique n'est pas plus ou moins bien optimisée qu'une requête statique.

    La seule différence réside dans le fait de la persistance en cache des plans.

    En 2005 vous pouvez opter pour une paramétrisation forcée au niveau de la base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER DATABASE ...
    SET PARAMETRIZATION = FORCED
    (de mémoire)

    A +

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 154
    Points : 62
    Points
    62
    Par défaut
    Le problème est qu'en faisant un execute('select.......'), aucune mise en cache ou optimisation est possible.
    On est donc coincé avec des temps horribles.

    J'ai essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER DATABASE ... SET PARAMETERIZATION FORCED
    mais sans voir aucune différence in fine.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 901
    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 901
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    aucune mise en cache ou optimisation est possible
    Pour la mise en cache oui c'est pas bien bon. Pour l'optimisation c'est la même que la requête en dur !

    Pour forcer la mise en cache utilisez sp_executesql.

    A +

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 154
    Points : 62
    Points
    62
    Par défaut
    tu veux dire faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sp_executesql('SELECT .....')
    ?

Discussions similaires

  1. Creation d'une requete avec "where" dynamique
    Par yozart dans le forum Développement de jobs
    Réponses: 9
    Dernier message: 11/01/2011, 10h13
  2. requete SQL avec where dynamique dans une servlet
    Par Mickael Scofild dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 12/08/2007, 12h05
  3. requete avec "WHERE" dynamique
    Par Mickael Scofild dans le forum Requêtes
    Réponses: 1
    Dernier message: 11/08/2007, 22h51
  4. [SQL] Requete avec ordre correspondant à la clause WHERE
    Par yobogs dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/06/2007, 14h32
  5. [SQL]Requete avec 2 count(*) sur la même table
    Par Sonny dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/11/2005, 16h41

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