Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1