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 :

Optimisation Recherche Multicritere [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut Optimisation Recherche Multicritere
    Bonjour,
    J'ai créé une recherche multicritère pour une application d'inventaire d'archives. Les documents sont catégorisés suivant leur nature (vidéo, papier, photo, carte...) L'application permet à l'utilisateur de rechercher une chaine de caractères comprise soit dans le titre du document, soit dans un mot-clé associé au document soit dans les deux (au moins l'un des deux contient le texte recherché).

    Tout fonctionne très bien avec un jeu de données d'une 10aine de documents, mais en passant à l'échelle supérieure (~60 documents), les temps de réponses de la recherche ne sont plus acceptables. Or l'application est vouée à répertorier des milliers de documents..... La recherche qui pose problème est lorsque l'utilisateur choisit de rechercher un texte à la fois dans les titres et les mots-clés (dans mon code: IF SEARCH IN TITLE & KEYWORD). Ma méthode de recherche est la suivante:
    - J'effectue une requête pour chaque élément VRAI dans le tableau myMedia, qui contient tous les Media que l'utilisateur veux voir s'afficher dans sa recherche (vidéos, papier, maps...). Si l'utilisateur veut voir les vidéos et les photos, il y aura 2 requêtes.
    - Le résultat de chaque requête est stockée dans mon tableau myQuery
    - J'effectue une union entre les résultats contenus dans myQuery
    - J'affiche le résultat de la recherche dans un formulaire

    Je cherche à voir comment optimiser ma fonction de recherche. Je suppose que le problème vient de l'utilisation de OR puis de UNION...? Aussi, j'aimerais pouvoir visualiser le résultat de mes requêtes intermédiaires en pas à pas. Comment fait-on cela? N'importe quelle idée d'optimisation est la bienvenue!
    Merci à tous!
    Marc

    P.S: Je réalise que c'est un peu usine à gaz... Mais je suis débutant en access, soyez indulgent!

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    Private Sub Btn_Search_Click()
     
        Dim myMedia()
        Dim myQuery()
        Dim DateCompare
        Dim MediaSearch As Boolean
        Dim DateSearch As Boolean
        Dim j
        myMedia = Array(Me!Cocher_Paper, Me!Cocher_Map, Me!Cocher_Audio, Me!Cocher_Video, Me!Cocher_Picture)
        j = 0
     
        ' SETTING UP DATE SEARCH CRITERIA
        If Me!TxtDate <> "" And Me!RangeDate = "Before" Then
            DateSearch = True
            DateCompare = "<="
        ElseIf Me!TxtDate <> "" And Me!RangeDate = "On" Then
            DateSearch = True
            DateCompare = "="
        ElseIf Me!TxtDate <> "" And Me!RangeDate = "After" Then
            DateSearch = True
            DateCompare = ">="
        Else
            DateSearch = False
        End If
     
        ' CHECKING MEDIA IS SELECTED FOR THE SEARCH
        If Me!Cocher_Paper = Flase And Me!Cocher_Map = False And Me!Cocher_Audio = False And Me!Cocher_Video = False And Me!Cocher_Picture = False Then
            MediaSearch = False
        Else
            MediaSearch = True
        End If
     
        If Me!TxtSearch <> "" And MediaSearch = True Then
     
            ' IF SEARCH IN TITLE
            If Me!Cadre_Options = 1 Then
                For i = 0 To UBound(myMedia)
                    If myMedia(i) Then
                        ReDim Preserve myQuery(j)
                        If DateSearch Then
                            myQuery(j) = "SELECT [ID_Document], [Title], [Author], [CreationDate], [Digitized], [TrailMark], [Media] FROM T_Documents, T_Types WHERE [TypeID] = [ID_Type] AND [TypeID] = " & i + 1 & " AND [CreationDate] " & DateCompare & " #" & Format(Me!TxtDate, "yyyy-mm-dd") & "# AND [Title] like '*" & Me!TxtSearch & "*' AND [Author] like '*" & Me!TxtAuthor & "*'"
                        Else
                            myQuery(j) = "SELECT [ID_Document], [Title], [Author], [CreationDate], [Digitized], [TrailMark], [Media] FROM T_Documents, T_Types WHERE [TypeID] = [ID_Type] AND [TypeID] = " & i + 1 & " AND [Title] like '*" & Me!TxtSearch & "*' AND [Author] like '*" & Me!TxtAuthor & "*'"
                        End If
                        j = j + 1
                    End If
                Next i
     
            ' IF SEARCH IN KEYWORD
            ElseIf Me!Cadre_Options = 2 Then
                For i = 0 To UBound(myMedia)
                    If myMedia(i) Then
                        ReDim Preserve myQuery(j)
                        If DateSearch Then
                            myQuery(j) = "SELECT DISTINCT [ID_Document], [Title], [Author], [CreationDate], [Digitized], [TrailMark], [Media] FROM T_Documents, T_Types, T_Junction, T_Keywords WHERE [ID_Document] = [Document_ID] AND [TypeID] = [ID_Type] AND [TypeID] = " & i + 1 & " AND [CreationDate] " & DateCompare & " #" & Format(Me!TxtDate, "yyyy-mm-dd") & "# AND [Keyword_ID] = [ID_Keyword]  AND [Word] like '*" & Me!TxtSearch & "*' AND [Author] like '*" & Me!TxtAuthor & "*'"
                        Else
                            myQuery(j) = "SELECT DISTINCT [ID_Document], [Title], [Author], [CreationDate], [Digitized], [TrailMark], [Media] FROM T_Documents, T_Types, T_Junction, T_Keywords WHERE [ID_Document] = [Document_ID] AND [TypeID] = [ID_Type] AND [TypeID] = " & i + 1 & " AND [Keyword_ID] = [ID_Keyword]  AND [Word] like '*" & Me!TxtSearch & "*' AND [Author] like '*" & Me!TxtAuthor & "*'"
                        End If
                        j = j + 1
                    End If
                Next i
     
            ' IF SEARCH IN TITLE & KEYWORD
            ElseIf Me!Cadre_Options = 3 Then
                For i = 0 To UBound(myMedia)
                    If myMedia(i) Then
                        ReDim Preserve myQuery(j)
                        If DateSearch Then
                            myQuery(j) = "SELECT DISTINCT [ID_Document], [Title], [Author], [CreationDate], [Digitized], [TrailMark], [Media] FROM T_Documents, T_Types, T_Junction, T_Keywords WHERE ([ID_Document] = [Document_ID] AND [TypeID] = [ID_Type] AND [TypeID] = " & i + 1 & " AND [CreationDate] " & DateCompare & " #" & Format(Me!TxtDate, "yyyy-mm-dd") & "# AND [Keyword_ID] = [ID_Keyword] AND [Title] like '*" & Me!TxtSearch & "*' AND [Author] like '*" & Me!TxtAuthor & "*') OR ([ID_Document] = [Document_ID] AND [TypeID] = [ID_Type] AND [TypeID] = " & i + 1 & " AND [CreationDate] " & DateCompare & " #" & Format(Me!TxtDate, "yyyy-mm-dd") & "# AND [Keyword_ID] = [ID_Keyword]  AND [Word] like '*" & Me!TxtSearch & "*' AND [Author] like '*" & Me!TxtAuthor & "*')"
                        Else
                            myQuery(j) = "SELECT DISTINCT [ID_Document], [Title], [Author], [CreationDate], [Digitized], [TrailMark], [Media] FROM T_Documents, T_Types, T_Junction, T_Keywords WHERE ([ID_Document] = [Document_ID] AND [TypeID] = [ID_Type] AND [TypeID] = " & i + 1 & " AND [Keyword_ID] = [ID_Keyword] AND [Title] like '*" & Me!TxtSearch & "*' AND [Author] like '*" & Me!TxtAuthor & "*') OR ([ID_Document] = [Document_ID] AND [TypeID] = [ID_Type] AND [TypeID] = " & i + 1 & " AND [Keyword_ID] = [ID_Keyword]  AND [Word] like '*" & Me!TxtSearch & "*' AND [Author] like '*" & Me!TxtAuthor & "*')"
                        End If
                        j = j + 1
                    End If
                Next i
            End If
     
            ' UNION OF QUERIES FOR EACH MEDIA SEARCHED FOR
            For i = 0 To UBound(myQuery)
                If i = 0 Then
                    StrRowSource = myQuery(i)
                Else
                    StrRowSource = StrRowSource & " UNION " & myQuery(i)
                End If
            Next i
     
            Me!ListSearchResults.RowSource = StrRowSource
     
        Else
            MsgBox "No text in Search box OR No Media Support selected...", vbOKOnly, "Warning"
        End If
     
    End Sub

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    à mon avis tes problèmes de performance viennent de là :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM T_Documents, T_Types

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM T_Documents, T_Types, T_Junction, T_Keywords

    Tu fais des produits croisés, c-à-d que tu mets en relation TOUS les enregistrements de toutes tes tables.
    Par exemple si tu as 10 documents et 10 types, cela oblige Access à créer 100 enregsitrements puis ensuite à trouver ceux qui t'intéressent dans le tas.
    C'est un des pires scénario de recherche d'info.

    Utilise l'éditeur de requête et crée les jointures appropriées, après tu changes l'affichage pour SQL (en haut à gauche) et tu peux voir le SQL généré.
    Tu peux ensuite te servir de cela pour écrire tes requêtes en SQL dans ton code VBA.
    Les jointures devrait aider Access à ne considérer que les enregistrements vraiment nécessaires.
    Parce qu'avec 60 enregsitrements tu ne devrais même pas te rendre compte que Access fait une recherche.

    Ensuite regarde si tu peux remplacer le UNION par un OR, logiquement cela devrait être possible.
    Un truc du genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from TaTable ...
    where 
       (taTable.TypeDocument="Photo" and ... ici tes autres critères)
       or (taTable.TypeDocument="Video" and ... ici tes autres critères)

    Une seule passe pour tous les résultats.

    A+
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    Merci marot,
    Comme tu me l'as indiqué, j'ai checké dans le module SQL d'Access. Je vais modifier mes requêtes avec des INNER JOIN.
    Merci!

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    Yes, j'ai donné une nouvelle jeunesse à mon application en remplaçant T_Documents, T_Junction... par des INNER JOIN !
    Super!
    Merci marot pour ton aide et ta réponse rapide !
    Marc

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 22/06/2010, 16h08
  2. Réponses: 1
    Dernier message: 22/02/2006, 19h01
  3. Formulaire de recherche multicriteres par cafeine
    Par jo-popo dans le forum Access
    Réponses: 8
    Dernier message: 12/01/2006, 00h53
  4. Réponses: 6
    Dernier message: 05/01/2006, 14h09
  5. Recherche multicritere
    Par beLz dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/09/2005, 18h24

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