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 PostgreSQL Discussion :

Requête très longue sur une table très simple


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Requête très longue sur une table très simple
    Bonjour à tous :

    Voila, j'ai une table très simple à 3 champs entier : origine,destination,temps

    La table se présente comme ça :

    origine;destination;temps(minutes)
    1 ; 2 ; 5
    1 ; 3 ; 6
    1 ; 4 ; 7
    2 ; 1 ; 8
    2 ; 3 ; 9
    2 ; 4 ; 10

    ....

    sur 70 millions de lignes

    cette table s'appelle matrice_tc_di dans un schéma transport,
    en gros j'ai des origines et des destinations modélisées par des entiers et un temps entre ces origines et ces destinations en minutes.

    J'ai posé un index unique tc_di_idx sur le couple (origine,destination)
    et un autre index tc_di_dst_idx (BTREE) sur le couple (destination,origine)

    La requête select * from transport.matrice_tc_di where origine = 5 ; est instantanée

    Par contre la requête select * from transport.matrice_tc_di where destination = 5 ; met 2 minutes !

    Avez vous une idée pour arranger ce problème ?


    Voici les traces pour les 2 requêtes :


    select * from transport.matrice_tc_di where origine = 5 ;

    QUERY PLAN
    ---------------------------------------------------------------------------------------------------------------------------------
    Bitmap Heap Scan on matrice_tc_di (cost=5274.51..319261.40 rows=281302 width=12) (actual time=2.105..32.657 rows=7539 loops=1)
    Recheck Cond: (origine = 5)
    -> Bitmap Index Scan on tc_di_idx (cost=0.00..5204.19 rows=281302 width=0) (actual time=2.093..2.093 rows=7539 loops=1)
    Index Cond: (origine = 5)
    Total runtime: 61.053 ms
    (5 rows)


    select * from transport.matrice_tc_di where destination = 5


    QUERY PLAN
    ---------------------------------------------------------------------------------------------------------------------------------------
    Bitmap Heap Scan on matrice_tc_di (cost=5274.51..319261.40 rows=281302 width=12) (actual time=159.886..121864.426 rows=7461 loops=1)
    Recheck Cond: (destination = 5)
    -> Bitmap Index Scan on tc_di_dst_idx (cost=0.00..5204.19 rows=281302 width=0) (actual time=144.149..144.149 rows=7461 loops=1)
    Index Cond: (destination = 5)
    Total runtime: 121988.927 ms
    (5 rows)
    NB : Je suis postgres 8.2.1 sur un Linux !

    J'ai essayé d'augmenter le paramètre work_mem mais ça ne sert à rien.

    Comment faire pour que mes 2 requêtes prennent le même temps d'exécution ?

    Merci pour vos idées et très bonne soirée à tous.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Et simplement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT origine,destination,temps 
    FROM transport.matrice_tc_di 
    WHERE destination = 5

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut ça ne change rien
    Bonjour,

    J'ai essayé mais il y a rien de mieux !

  4. #4
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Les statistiques sont-elles bien calculées sur la table ?
    Essaie un VACUUM FULL ANALYZE sur ta table

    Les colonnes origine et destination de ta table sont-elles bien tous les deux de type entier/numérique ?

    Combien de lignes sont renvoyés pour origine=5 et combien pour destination=5 ?

    C'est peut-être tout simplement que la requête renvoie plus de lignes pour destination=5 donc accède plus de fois à l'index ...
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Oui les types sont entiers pour les 3 colonnes.

    Le VACUUM FULL ANALYSE a l'air de donner un léger mieux !
    (je pense que ce mieux va pas être assez intéressant pour mes boss )

    Sinon le nombre de lignes est identique depuis l'origine ou la destination

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    NB :Sinon j'ai exactement une table identique avec 393 Millions de lignes après.
    Déjà la petite table de 70 Millions de lignes me posent pas mal de pbs !

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut CLUSTER MAGIC


    J'ai trouvé et ça marche super bien !

    En fait :

    Je lance la commande CLUSTER sur mon index (destination,origine) et la requête se fait très bien .

    Merci à tous

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

Discussions similaires

  1. [MySQL] Requête multi-critère dans une table très simple
    Par flashnet dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/05/2013, 20h56
  2. [11GR3] Performances très longues sur des tables sys
    Par ApprentiOracle dans le forum Administration
    Réponses: 3
    Dernier message: 18/04/2013, 13h47
  3. Optimiser une requête ORDER BY sur une table volumineuse
    Par micaz dans le forum Administration
    Réponses: 4
    Dernier message: 19/01/2010, 01h19
  4. Réponses: 2
    Dernier message: 17/06/2009, 10h12
  5. Sélection très longue sur une vue
    Par mister3957 dans le forum SQL
    Réponses: 6
    Dernier message: 13/02/2009, 10h01

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