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 :

Optimisation d'une requête longue


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 53
    Points
    53
    Par défaut Optimisation d'une requête longue
    Bonjour
    j'ai des requetes que je stock dans un champs de 255 caractères pour les utiliser.

    toutes les requêtes sont courtes à part celle la que je suis sur qu'elle peut être réécrite autrement pour rentrer dans ce champs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from factv where date_m>'01/01/2014'   
    and (client in(select code from c_client where portefeuille like 'DRGE%' or portefeuille like 'DRHP%' or portefeuille like 'D-C-E%') 
           or origine in(select bl from blv where client in(select code from c_client where portefeuille like 'DRGE%' or portefeuille like 'DRHP%' or portefeuille like 'D-C-E%')))
    est ce qu'il y a une possibilité?

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Le titre est trompeur. C'est pas une "optimisation d'une requête longue" (une requête qui prend trop de temps à s'exécuter).

    C'est juste que vous faites des trucs bizarres à stocker du code SQL dans une table...

    Citation Envoyé par BYALI Voir le message
    j'ai des requetes que je stock dans un champs de 255 caractères pour les utiliser.
    Y'en a qui cherchent les problèmes...

    Citation Envoyé par BYALI Voir le message
    est ce qu'il y a une possibilité?
    Oui (entre autres) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE [Ma_super_table_de_requetes_sql]
    ALTER COLUMN CodeSql NVARCHAR(MAX)



    Même en essayant d' "optimiser" (les perfs, pas la taille du code), ça fait 292 caractères :

    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
    SELECT F.*
    FROM
    (    
        select code
        from c_client
        where portefeuille like 'DRGE%'
        or portefeuille like 'DRHP%'
        or portefeuille like 'D-C-E%'
    ) C
    LEFT JOIN blv B
        ON (B.client = C.code)
    INNER JOIN factv F
        ON (F.client = C.code
        OR F.origine = B.bl)
    where F.date_m > '2014-01-01'
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 53
    Points
    53
    Par défaut
    C'est juste que vous faites des trucs bizarres à stocker du code SQL dans une table...
    avant de juger, poser la question pourquoi je stocke;
    j'ai une application de transfert de données entre 2 sites distants, sauf que je filtre les données pour certains sites.
    je dois stocker le filtre dans une base, car c'est variant d'un site à l'autre.


    pour la proposition de l'optimisation; ça marche pas il y a des doublons

    SELECT F.*
    FROM
    (
    select code
    from c_client
    where portefeuille like 'DRGE%'
    or portefeuille like 'DRHP%'
    or portefeuille like 'D-C-E%'
    ) C
    LEFT JOIN blv B
    ON (B.client = C.code)
    INNER JOIN factv F
    ON (F.client = C.code
    OR F.origine = B.bl)
    where F.date_m > '2014-01-01'

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par BYALI Voir le message
    avant de juger, poser la question pourquoi je stocke;
    j'ai une application de transfert de données entre 2 sites distants, sauf que je filtre les données pour certains sites.
    je dois stocker le filtre dans une base, car c'est variant d'un site à l'autre.
    J'ai déjà vu des gens stocker des requêtes SQL dans une base de données.

    Ce qu'on en retient :
    - c'est rarement une bonne idée pour tout un tas de raisons (y compris : performance et sécurité) et il y a souvent d'autres manières de procéder
    - dans les rares cas où ça se justifierait, la personne ayant implémenté cette solution ne se serait pas limité à 255 caractères

    (et pourquoi pas 140 caractères, qu'on puisse tweeter le code ? )

    Citation Envoyé par BYALI Voir le message
    pour la proposition de l'optimisation; ça marche pas il y a des doublons
    Et bien sûr, vous ne savez pas :
    1. pourquoi il y a des doublons ? (je vous laisse un indice : vous avez 2 conditions vérifiées en même temps)
    2. comment les supprimer ?

    Vous ne comprenez pas pourquoi j'évite de faire 2 fois la même sous-requête et en quoi la requête est fondamentalement différente ?
    Vous pensez que j'ai le pouvoir d'executer des requêtes à distance sur vos données, pour pouvoir vous servir la solution du premier coup et sur un plateau doré ?

    Ben non, et plutôt que de chercher, c'est tellement plus simple de dire...

    "Ça marche PAAAAAAAAAAAS !"

    Et de toute façon, la solution oblige à ajouter un peu de code, donc ça ne rentrera pas dans vos 255 caractères...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Pour gagner des caractères (mais c'est clairement un faux problème ici) vous pouvez penser créer des vues SQL entre vos différentes tables afin d'éviter les IN avec sous select etc...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Pour gagner des caractères (mais c'est clairement un faux problème ici) vous pouvez penser créer des vues SQL entre vos différentes tables afin d'éviter les IN avec sous select etc...
    Il y a plein de solutions envisageables :
    - écrire des vues
    - écrire une procédure stockée et faire appel à celle-ci (dangereux)
    - vu que c'est pour tranférer des données entre différents sites, faire des réplications et mettre des filtres sur certaines tables

    Cependant :
    - certaines de ces "solutions" sont à éviter
    - il y a certainement d'autres contraintes qu'on ne connait pas
    - comme tu l'as dit, le problème de la longueur du code, "c'est un faux problème"

    Pour paraphraser Marvin dans "Le guide du voyageur galactique" :
    "J'ai un million d'idées, elles mennent toutes à une mort certaine".
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 53
    Points
    53
    Par défaut
    Merci pour vos orientations,
    je devrais revoir l'écriture des jointures.
    c'est compliqué de vous expliquer pourquoi j'ai choisi d'écrire la requete sur un champs à 255 caractère.

    Mais je tacherai à prendre en considération vos orientations.

    Merci pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/09/2009, 11h10
  2. Optimisation d'une requête d'insertion
    Par fdraven dans le forum Oracle
    Réponses: 15
    Dernier message: 01/12/2005, 14h00
  3. Optimisation d'une requête patchwork
    Par ARRG dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/09/2005, 15h23
  4. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  5. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 17h54

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