PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 05/09/2019 12:00:01

null008
Membre

seqscan face a un parcour d'index

bonjour a tous ,

je suis entrain de faire quelque test pour améliorer es connaissance sur postgresql administration

en début j'ai crée ce table  et j'ai essayer de faire une insertion en masive du donné

insert into t1 ( a, b, c )
select aa, bb, cc
  from generate_series(1,10000000) aa
     , md5(aa::varchar) bb
     , now() cc;
NSERT 0 10000000

puis j'ai crée cette index

create index concurrently "index_created_at_on_users"
on t1  btree (a);

sur le colonne a

mais si je fait select a fro t1 j'ai toujour un seqscan

 Seq Scan on t1  (cost=0.00..193457.87 rows=9999987 width=4)
(1 ligne)

j'ai lancer un

VACUUM(FULL, ANALYZE) t1 

mais toujours optimiseur fait un seqscan

Qui a une idée coment je peut forcer optimiseur a utilisée un parcour d'index

merci pour vos aides

Hors ligne

#2 05/09/2019 15:12:59

ruizsebastien
Membre

Re : seqscan face a un parcour d'index

bonjour,

Si je ne me trompe pas le generate_series va insérer 10 millions de valeurs distinctes dans la colonne a.
Donc l'index ne sera jamais utilisé car il n'y a aucun intérêt par rapport au parcours de la table lui-même.

De plus dans votre select il n'y a pas de clause where.

Dernière modification par ruizsebastien (05/09/2019 15:16:20)


Cordialement,

Sébastien.

Hors ligne

#3 05/09/2019 15:41:26

gleu
Administrateur

Re : seqscan face a un parcour d'index

Parce que le coût du parcours séquentiel est moindre que celui du parcours d'index :

postgres=# explain select a from t1;
                          QUERY PLAN                          
--------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..193458.06 rows=10000006 width=4)
(1 row)

postgres=# set enable_seqscan to off;
SET
postgres=# explain select a from t1;
                                     QUERY PLAN                                     
------------------------------------------------------------------------------------
 Index Only Scan using t1_a_idx on t1  (cost=0.43..353149.52 rows=10000006 width=4)
(1 row)

Et en soit, il n'a pas tort :

postgres=# explain (analyze) select a from t1;
                                                   QUERY PLAN                                                    
-----------------------------------------------------------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..193458.06 rows=10000006 width=4) (actual time=0.051..939.495 rows=10000000 loops=1)
 Planning Time: 1.283 ms
 Execution Time: 1212.499 ms
(3 rows)

postgres=# set enable_seqscan to off;
SET
postgres=# explain (analyze) select a from t1;
                                                               QUERY PLAN                                            
                   
---------------------------------------------------------------------------------------------------------------------
-------------------
 Index Only Scan using t1_a_idx on t1  (cost=0.43..353149.52 rows=10000006 width=4) (actual time=0.079..1934.432 rows
=10000000 loops=1)
   Heap Fetches: 10000000
 Planning Time: 0.042 ms
 Execution Time: 2202.049 ms
(4 rows)

Guillaume.

Hors ligne

#4 05/09/2019 15:44:41

gleu
Administrateur

Re : seqscan face a un parcour d'index

Sébastien: PostgreSQL peut faire un parcours d'index même sans clause WHERE si toutes les colonnes intéressantes pour le SELECT sont dans l'index, ce qui est le cas là. On appelle ça un Index Only Scan.


Guillaume.

Hors ligne

#5 06/09/2019 10:14:25

ruizsebastien
Membre

Re : seqscan face a un parcour d'index

mais oui bien sûr où avais-je la tête ;-)
Merci pour ces précisions.


Cordialement,

Sébastien.

Hors ligne

Pied de page des forums