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 n'utilisant pas l'index malgré les conditions dans where


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Par défaut Requête n'utilisant pas l'index malgré les conditions dans where
    Bonjours les amis, voilà j'ai 2 tables assez importantes
    table1 contient 23000000 d'enregistreement et table2 continent 63 000 000 d'enregistrement, voici la requête

    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
    select 
    	ss.id_d,
    	ss.id_w, 
    	ss.t, 
    	sg.o 
    from (
    	select 
    		s.id_d, 
    		s.id_w, 
    		s.t 
    	from 
    		table1 s where not exists(
    			select 
    				id_d, 
    				id_w 
    			from 
    				table1_updated
    			where 
    				s.id_d = id_d 
    				and s.id_w = id_w
    			) limit 1000000
    	) as ss, 
    	table2 sg	
    where 
    	ss.id_d = sg.id_d 
    	and ss.id_w = sg.id_w 
    	and ss.t = sg.t
    la table table1_updated est une table que je remplisse après que mon programme parcours cette query

    ces 3 tables ont un PK sur les deux colonnes id_d et id_w (id_d, id_w) et j'ai un index mono-colonne sur les 3 colonnes qui sont id_d, id_w et t sur les table1 et table2 pourtant quand j'exécute la requête, elle n'utilise aucun index, elle fait un Seq Scan sur toutes ces 3 tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Merge Join  (cost=11963108.56..12601006.26 rows=36036 width=36)
      Merge Cond: ((sg.id_word = s.id_word) AND ((sg.id_document)::text = (s.id_document)::text) AND ((sg.texte)::text = (s.texte)::text))
      ->  Sort  (cost=11565940.41..11723238.27 rows=62919144 width=37)
            Sort Key: sg.id_word, sg.id_document, sg.texte
            ->  Seq Scan on sugg sg  (cost=0.00..1695264.44 rows=62919144 width=37)
      ->  Sort  (cost=397167.22..399667.22 rows=1000000 width=32)
            Sort Key: s.id_word, s.id_document, s.texte
            ->  Limit  (cost=41.75..287509.37 rows=1000000 width=32)
                  ->  Hash Anti Join  (cost=41.75..3926263.33 rows=13657961 width=32)
                        Hash Cond: (((s.id_document)::text = (string_updated.id_document)::text) AND (s.id_word = string_updated.id_word))
                        ->  Seq Scan on string s  (cost=0.00..3576742.28 rows=14453428 width=32)
                        ->  Hash  (cost=22.70..22.70 rows=1270 width=34)
                              ->  Seq Scan on string_updated  (cost=0.00..22.70 rows=1270 width=34)
    Ma question c'est pourquoi cette requête n'utilise-elle aucun index?

    Merci déjà pour votre réponse

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,


    Si postgres n'utilise pas d'index c'est qu'il estime que le coût sera moins grand en utilisant un scan de table qu'en utilisant les index disponibles.

    On peut voir que le "NOT EXISTS" n'élimine que 1 000 000 de lignes.

    Je ne trouve donc pas aberrant le plan d’exécution.


    (il faudrai lancer un explain analyze pour voir si le plan est correct ceci dit)

  3. #3
    Membre actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Par défaut
    Merci beaucoup pour ta réponse,

    je crois que le plan est correct, j'ai déjà lancerEXPLAIN ANALYZE dessus mais le résultat est le même sauf avec un temps de 10mn, je vais le poster plus tard car là je ne suis pas encore au taf

    postgres lit les fichiers de données dans ce sens

    table2 puis, table1

    aucun lecture sur les fichiers de données des index,
    ce qui m'étonne c'est que lorsque je fait la requête morceau par morceau, elles utilisent bien les index (je posterais aussi les EXPLAIN plus tard)

    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
    SELECT 
    		s.id_d, 
    		s.id_w, 
    		s.t 
    	FROM 
    		table1 s WHERE NOT EXISTS(
    			SELECT 
    				id_d, 
    				id_w 
    			FROM 
    				table1_updated
    			WHERE 
    				s.id_d = id_d 
    				AND s.id_w = id_w
    			) LIMIT 1000000
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    	s.id_d, 
    	s.id_w, 
    	s.t 
    FROM 
    	table1 s, 
    	table2 sg	
    WHERE 
    	sg.id_d = s.id_d 
    	AND sg.id_w = s.id_w 
    	AND sg.t = s.t

Discussions similaires

  1. Pourquoi cette requête n'utilise pas d'index ?
    Par seal3 dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/08/2009, 18h03
  2. Pourquoi Oracle n'utilise pas mes index ?
    Par yaggi64 dans le forum SQL
    Réponses: 4
    Dernier message: 25/11/2007, 16h03

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