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

Requêtes et SQL. Discussion :

Améliorer la performance d'une requête


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Améliorer la performance d'une requête
    J'ai créé une requète qui inclut l'expression suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dlookup ("[colonne2]", "Table","[Colonne1]="""&Colonne2&"""")
    L'expression affiche dans la colonne 3 Col2 avec comme critère que Col1= valeur de Col2

    Le résultat de ma requète se présente ainsi:

    Col1 Col2 Col3
    A B C
    B C C
    C C C

    Il me convient mais je fais face à un grave problème de performance.

    En effet ma table contient 400 000 enregistrements.

    100% des ressources calcul de ma machine sont sollicitées et la requète dure des heures.

    Quelqu'un saurait-il comment construire quelque chose de plus performant?

    Bien amicalement

    Boris
    (qui apprend Acess et le SQL et qui trouve ça bien difficile!)

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 266
    Points
    34 266
    Par défaut
    Bonjour,
    plus simple
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MaTable WHERE Col1=Col2
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Euh..Piou Piou...Tu es sûr?
    Il me semble que ta requète affiche col1 et col2 avec des valeurs rigoureusement identiques.

    Ce n'est pas ce que je veux obtenir.

    Si on considère la première ligne de mon exemple,
    Col1 = A
    Col2= B

    et alors Col3 = C

    Car ma fonction trouve B dans la colonne 1 et donc c'est C qui est affiché du fait de mon critère.

    amicalement

    Boris

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 266
    Points
    34 266
    Par défaut
    euh,
    il s'agit alors tout simplement d'une self-jointure ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT A.Col1,A.Col2, B.Col2 AS Col3 FROM MaTable A INNER JOIN MaTable B On A.Col2 = B.Col1

    ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Sous-requête SQL à la place de DLookup().
    Bonjour BorisShem et jpcheck,

    BorisShem je dois reconnaître que je n'ai pas bien compris l'objectif de la requête.

    Citation Envoyé par BorisShem Voir le message
    J'ai créé une requète qui inclut l'expression suivante: dlookup ("[colonne2]", "Table","[Colonne1]="""&Colonne2&"""")

    L'expression affiche dans la colonne 3 Col2 avec comme critère que Col1= valeur de Col2

    Le résultat de ma requète se présente ainsi:

    Col1 Col2 Col3
    A B C
    B C C
    C C C

    Il me convient mais je fais face à un grave problème de performance.
    [...]
    Quelqu'un saurait-il comment construire quelque chose de plus performant?
    [...]
    Boris
    (qui apprend Acess et le SQL et qui trouve ça bien difficile!)
    Aussi je crois que ce sera difficile de bien t'aider à optimiser ta requête si tu n'exprimes pas ton objectif en *français*.
    En plus ce serait sympa de nous donner le SQL de la requête.

    A défaut de te comprendre, je propose déjà une première suggestion: ne pas utiliser DLookup.
    La fonction DLookup() n'est pas du tout optimisable pour une requête SQL.
    En revanche, il est possible de lui substituer une sous-requête SQL équivalente qui elle sera *optimisable*.

    Au lieu de :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT A.*, DLookup("Colonne2", "MaTable", "Colonne1=""" & A.Colonne2 & """") 
    FROM MaTable AS A
    Préférer:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT A.*, (SELECT B.Colonne2 FROM MaTable AS B WHERE B.Colonne1 = A.Colonne2) 
    FROM MaTable AS A
    _

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Indexer les champs dont on compare les valeurs
    Suggestion suivante...

    Si tu effectues de nombreuses comparaisons entre 2 champs, il serait sans doute très avantageux de les indexer.

    Les champs colonne1 et colonne2 sont-ils indexés ?
    _

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 12
    Points
    12
    Par défaut précisions sur problème de hiérarchie
    Tout d'abord merci pour vos réponses.

    Je précise ma problématique "métier": Je veux déterminer le sommet d'une hiérarchie.

    La colonne 1 affiche tous les enregistrements d'une base.
    La colonne 2 affiche le supérieur hiérarchique immédiat de la colonne 1.

    Dans l'exemple ci-dessous que j'espère plus parlant que mon premier exemple, on comprend facileent que 2 est supérieur de 1, que 3 est supérieur de 2 etcc..


    Col1.........Col2
    1.............2
    2.............3
    3.............4

    On retrouve les valeurs de la Col1 dans la col2. Sauf 1 dans mon exemple puisqu'il n'est le supérieur de personne.


    A l'arrivée, je voudrais afficher:

    Col1.......Col2.......Haut hiérarchie
    1...........2...........4
    2...........3...........4
    3...........4...........4


    Idéalement, j'aimerais avoir chaque niveau intermédaire.

    Attention, mon exemple est très simple mais la réalité est evidemment plus complexe:

    il n'y a pas qu'un seul sommet hiérarchique.
    Un supérieur hiérarchique peut avoir plusieurs subordonnés. ( par exemple, plusieur valeurs de la col1 ont la même valeur corresondante dans la col2. Et ainsi de suite).

    Amicalement

    Boris

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 266
    Points
    34 266
    Par défaut
    SAlut,
    tu peux te bricoler une fonction, du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'en partant du principe que Col1 = Col2 indique pas de supérieur
    Function GetSuperior(Id_Employe As Integer) As Integer
    GetSuperior= DLookup("Col2","MaTable","Col1=" & tmpId)
    End Function
    tu fais une fonction récursive qui se base là dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function GetUltimate(Id_Employe As Integer) As Integer
    Dim tmpId As Integer
    Dim tmpSup As Integer
    tmpId = Id_Employe
    tmpSup = GetSuperior(tmpId)
    Do While tmpId<>tmpSup
    tmpId = tmpSup
    tmpSup = GetSuperior(tmpSup)
    Loop
    GetUltimate = tmpId
    End Function
    au final, une requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Col1, Col2, GetUltimate(Col1) As Col3 FROM MaTable;
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Obtenir le sommet d'une hiérarchie
    Merci à tous pour vos réponses qui m'ont permis de progresser dans ma connaissance d'Access. (La fonction récursive de piou piou va notamment me permettre de résoudre un autr problème.)

    Le problème étant un peu plus complexe que je le croyais, j'ai pensé à une nouvelle méthode pour obtenir le résultat souhaité.

    Rappel du problème: Pour un client appartenant à une hiérarchie, j'ai besoin de connaitre le sommet de la hiérarchie.

    Chaque client possède un numéro hiérarchique (LVL)de 1 à 10. Mais les sommets hiérarchiques n'ont pas forcément le même numéro. (ce serait trop simple).

    J'ai cependant le moyen d'extraire une base qui pour chaque client indiquera tous ses supérieurs hiérarchiques avec leurs numéros hiérarchiques.

    Le numéro hiérarchique le plus élevé est forcément le sommet de la hiérarchie.

    Voici comment se présente la base:

    CLIENT....SUP.......LVL
    A...........B.......... 6
    A...........C.......... 7
    A...........D.......... 8
    E.......... F.......... 5
    E.......... G.......... 6


    Dans cet exemple, le sommet de A est D car D a le LVL le plus élevé.
    E a pour sommet 6.
    Le résultat que je souhaite obtenir est donc celui ci.
    CLIENT...SUP.......LVL
    A...........D...........8
    E...........G...........6

    Je dois donc dédoublonner la colonne CLIENT en affichant la valeur maximum du LVL pour chaque client.

    Quelqu'un sait-il comment faire ça?

  10. #10
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut jpcheck, =JBO= et BorisShem

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select
       *
    from maTable as t1
    where lvl=(select max(lvl) from maTable where client=t1.client)
    te donne uniquement les enregistrements contenant les "sommets"


Discussions similaires

  1. Réponses: 13
    Dernier message: 11/02/2010, 14h00
  2. Améliorer les performances d'une requête avec agrégats
    Par alexis_ dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/11/2009, 22h31
  3. [MySQL 5]Performance d'une requêtes select
    Par SuperCed dans le forum Requêtes
    Réponses: 8
    Dernier message: 01/08/2006, 12h51
  4. [SQL2K] Problème anormal de performance d'une requète
    Par G. Goossens dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/03/2006, 12h06
  5. [SQL ] performances dans une requête
    Par claralavraie dans le forum Oracle
    Réponses: 12
    Dernier message: 05/01/2006, 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