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

SQL Firebird Discussion :

une addition dans la clause where : pb d'index ?


Sujet :

SQL Firebird

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut une addition dans la clause where : pb d'index ?
    bonjour a tous


    j'ai une table qui contient les informations sur une session (Qui, ou et quand)
    et une table qui contient les détails de cette session (data). Cette table contient une colonne qui indique si l'action a eu lieu le jour de la session ou le lendemain
    En effet, on peut commencer une session tard dans la nuit (23h00 par exemple et se poursuivre jusqu'au lendemain, disons 03h00 du matin). Aussi le passage d'une jour à l'autre est indiqué par une colonne "DATE_ADD" de la table DATA :
    * 0 : l'action a eu lieu le même jour que le début de la session
    * 1 : l'action s'est poursuivit le lendemain du début de la session
    * ...

    Afin de pouvoir tenir compte de cela, j'ai plusieurs requêtes qui ont cette structure (dans un but de lisibilité, je l'ai simplifiée au maximum ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT N_data.Id_data_princ
      FROM N_data
        INNER JOIN N_session ON (N_session.Id_session = N_data.Id_session)
    WHERE N_session.Date_session = :Date_in
    l’exécution de cette requête est très rapide (quelques ms).

    Mais si je utilise la colonne DATE_ADD pour tenir compte de ces passages de jours, ainsi :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT N_data.Id_data_princ
      FROM N_data
        INNER JOIN N_session ON (N_session.Id_session = N_data.Id_session)
    WHERE N_session.Date_session + N_Data.Date_Add = :Date_in

    Le temps d’exécution de celle ci devient très important (environ 10 sec. en utilisant bien les index crées).
    Le changement majeure intervient dans la lecture de la table N_Data où le nombre de lectures indexées passe de 1500 dans le premier cas a plus de 4 000 000 dans le second.

    Quelqu'un aurait-il une explication et surtout une solution ?

    merci d'avance

    olivier
    Merci d'ajouter un sur les tags qui vous ont aidé

  2. #2
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    c'est quoi le plan dans les deux cas ?

    et en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE N_session.Date_session  = (:Date_in - N_Data.Date_Add)
    ?
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    bonjour Philippe

    et merci pour ta réponse

    1 . Avec WHERE N_session.Date_session = :Date_in,
    le plan d'exécution est :
    PLAN JOIN (N_SESSION INDEX (IDX_N_SESSION_DATE), N_DATA INDEX (FK_BAGUE_ID_SESSION))

    Query Time
    ------------------------------------------------
    Prepare : 0.00 ms
    Execute : 16.00 ms
    Avg fetch time: 0.50 ms

    Memory
    ------------------------------------------------
    Current: 105*870*168
    Max : 134*151*456
    Buffers: 2*048

    Operations
    ------------------------------------------------
    Read : 137
    Writes : 0
    Fetches: 3*361
    Marks : 0


    Enchanced Info:
    +--------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
    | Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts | Backouts | Purges | Expunges |
    | | Total | reads | reads | | | | | | |
    +--------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
    | N_DATA| 0 | 1505 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
    | N_SESSION| 0 | 69 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
    +--------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+

    2 . Avec WHERE N_session.Date_session + N_Data.Date_Add = :Date_in, il est :
    PLAN JOIN (N_SESSION NATURAL, N_DATA INDEX (FK_BAGUE_ID_SESSION))

    Query Time
    ------------------------------------------------
    Prepare : 0.00 ms
    Execute : 6*973.00 ms
    Avg fetch time: 217.91 ms

    Memory
    ------------------------------------------------
    Current: 105*849*392
    Max : 134*151*456
    Buffers: 2*048

    Operations
    ------------------------------------------------
    Read : 104*905
    Writes : 0
    Fetches: 11*435*963
    Marks : 0


    Enchanced Info:
    +--------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
    | Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts | Backouts | Purges | Expunges |
    | | Total | reads | reads | | | | | | |
    +--------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
    | N_DATA| 0 | 4481039 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
    | N_SESSION| 0 | 0 | 493370 | 0 | 0 | 0 | 0 | 0 | 0 |
    +--------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
    3 . Et avec WHERE N_session.Date_session = :Date_in - N_Data.Date_Add, il est :
    PLAN JOIN (N_SESSION NATURAL, N_DATA INDEX (FK_BAGUE_ID_SESSION))

    Query Time
    ------------------------------------------------
    Prepare : 0.00 ms
    Execute : 7*083.00 ms
    Avg fetch time: 221.34 ms

    Memory
    ------------------------------------------------
    Current: 105*849*360
    Max : 134*151*456
    Buffers: 2*048

    Operations
    ------------------------------------------------
    Read : 104*913
    Writes : 0
    Fetches: 11*435*963
    Marks : 0


    Enchanced Info:
    +--------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
    | Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts | Backouts | Purges | Expunges |
    | | Total | reads | reads | | | | | | |
    +--------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
    | N_DATA| 0 | 4481039 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
    | N_SESSION| 0 | 0 | 493370 | 0 | 0 | 0 | 0 | 0 | 0 |
    +--------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+

    NB : l'écriture de la requête a été simplifiée pour sa lisibilité
    NB1 : je suis sous 2.5 mais pas toute la dernière version.
    Merci d'ajouter un sur les tags qui vous ont aidé

  4. #4
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    oui de fait, l'index ne peux pas être utilisé IDX_N_SESSION_DATE
    puisque de toute façon, il faut calculer toutes les valeurs de N_session.Date_session + N_Data.Date_Add

    sauf si N_Data.Date_Add ne peut être négatif (ce qui semble être le cas)
    du coup il faudrait essayer qq chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE N_session.Date_session >= :Date_in
    and N_session.Date_session + N_Data.Date_Add = :Date_in

    sinon il faut revoir le modèle et gérer ses dates autrements
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Merci philippe

    j'ai utilisé ton petit truc et c'est quand même beaucoup mieux.


    je l'ai juste modifié pour limité encore le nombre de possibilité, en considérant qu'il est hautement improbable que quelqu'un puisse travailler non-stop pendant plus de 3 jours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE N_session.Date_session BETWEEN :Date_in AND :Date_in + 3
    AND N_session.Date_session + N_Data.Date_Add = :Date_in
    Merci encore

    olivier
    Merci d'ajouter un sur les tags qui vous ont aidé

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

Discussions similaires

  1. [MySQL] Introduire une variable dans la clause where
    Par ledisciple dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/08/2009, 12h39
  2. Réponses: 2
    Dernier message: 29/01/2007, 13h41
  3. tri par rapport à une liste dans la clause where
    Par umbakrail dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 19/07/2006, 11h32
  4. Réponses: 3
    Dernier message: 11/12/2005, 11h15
  5. Réponses: 1
    Dernier message: 09/12/2005, 23h34

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