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 :

Lenteur Requête depuis 2.5


Sujet :

SQL Firebird

  1. #1
    Membre averti
    Profil pro
    Directeur technique
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Par défaut Lenteur Requête depuis 2.5
    Bonjour,

    Je viens de passer mon serveur Firebird en version 2.5 64 bits.
    Avant, j'étais en version 2.1 32 bits.

    Cette requête mettait 15ms pour répondre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * FROM contacts  c
    WHERE c.indexcontact in (select indexcontact from contacts_fullsearch where f.phonex like ((select phonex from proc_phonex('pol'))||'%'))
    Depuis que je suis passé en version 2.5, la requête répond en 3s

    Si je décompose cette requête en 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select phonex from proc_phonex('pol')
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * FROM contacts  c
    WHERE c.indexcontact in (select indexcontact from contacts_fullsearch where f.phonex like ('pol'||'%'))
    dans les 2 cas, réponse à nouveau en 15ms.
    J'ai donc solutionné mon problème, mais je voudrais comprendre ce pb et peut être le résoudre autrement sur une seul requête

    Informations :
    proc_phonex est une procédure stockée
    contacts_fullsearch est une table avec une clé sur le champs phonex et une clé sur le champs indexcontact

  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 : 62
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    c'est quoi les plans des différents requetes ?

  3. #3
    Membre averti
    Profil pro
    Directeur technique
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Par défaut Plans
    1ère requête :
    PLAN (PROC_PHONEX NATURAL)
    PLAN (F INDEX (FK_CONTACTS_FULLSEARCH_1))
    PLAN (C NATURAL)

    2ème requête :
    PLAN (F INDEX (FK_CONTACTS_FULLSEARCH_1, CONTACTS_FULLSEARCH_IDX3))
    PLAN (C NATURAL)

    La réponse est bien là, mais je ne sais pas l'analyser ...

  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 : 62
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    le plan sous 2.1 et le plan sous 2.5 de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM contacts  c
    WHERE c.indexcontact IN (SELECT indexcontact FROM contacts_fullsearch WHERE f.phonex LIKE ((SELECT phonex FROM proc_phonex('pol'))||'%'))
    c'est ça qu'il faut comparer
    et aussi donner la définition des index

    et est ce que les stats des index ont été mises à jour ?

    et que donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WITH CTEA AS 
    (SELECT phonex FROM proc_phonex('pol')),
    CTEB AS
    (SELECT indexcontact FROM contacts_fullsearch WHERE f.phonex STARTING WITH CTEA.phonex)
    SELECT * FROM contacts  c
    JOIN CTEB ON c.indexcontact = CTEB.indexcontact

  5. #5
    Membre averti
    Profil pro
    Directeur technique
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Par défaut Plan sous 2.1
    Plan sous 2.1 :
    PLAN (PROC_PHONEX NATURAL)
    PLAN (F INDEX (FK_CONTACTS_FULLSEARCH_1))
    PLAN (C NATURAL)

    donc identique à 2.5, mais avec un délai de réponse beaucoup plus court.

    Je poursuis les recherche avec les CTE

  6. #6
    Membre averti
    Profil pro
    Directeur technique
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Par défaut Avec les CTE
    Firebird n'aime pas les CTE de procédure stockée

    j'ai modifié votre proposition comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH CTEB AS
    (SELECT indexcontact FROM contacts_fullsearch f WHERE f.phonex STARTING WITH (select phonex from proc_phonex('pol')))
    SELECT * FROM contacts  c
    JOIN CTEB ON c.indexcontact = CTEB.indexcontact
     
    PLAN (PROC_PHONEX NATURAL)
    PLAN JOIN (CTEB F INDEX (CONTACTS_FULLSEARCH_IDX3), C INDEX (PK_CONTACTS))

    et là : CQFD, réponse rapide en une seule reqûte.
    Merci makowski.

    J'ai essayé aussi ceci (sans les CTE) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM contacts  c
    JOIN contacts_fullsearch f ON c.indexcontact = f.indexcontact
    where f.phonex STARTING WITH (select phonex from proc_phonex('pol'))
     
    PLAN (PROC_PHONEX NATURAL)
    PLAN JOIN (F INDEX (CONTACTS_FULLSEARCH_IDX3), C INDEX (PK_CONTACTS))
    La reqête avec le CTE est toujours plus rapide (de 100 ms ~)

    Je me demandai si les CTE étaient seulement esthétiques.
    Et bé non.

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

Discussions similaires

  1. Lenteur requête avec 17 LEFT JOIN. Comment l'optimiser?
    Par spitou_77 dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/10/2007, 16h44
  2. Execution requête depuis VBA
    Par Tiresia dans le forum Sybase
    Réponses: 1
    Dernier message: 20/06/2007, 09h00
  3. Réponses: 4
    Dernier message: 24/04/2007, 16h45
  4. envoie de donnée dans une requéte depuis un liste déroulante
    Par steve o'steen dans le forum Langage
    Réponses: 1
    Dernier message: 17/10/2006, 16h24
  5. Réponses: 4
    Dernier message: 15/11/2005, 12h19

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